【问题标题】:Where is groups__name documented?groups__name 记录在哪里?
【发布时间】:2013-02-15 15:47:54
【问题描述】:

我的 Django 应用有几种不同类型的用户。对于我的项目模型,我想将 pm 列限制为仅属于“项目经理”组的用户对象。在浏览 SE 并搜索了一下之后,我添加了“limit_choices_to”并分配了一个 Q 对象。

但是,当我设置一个我确信会失败的 TestCase 时,似乎任何用户都可以添加为 pm。模型和测试用例如下:

class Project(models.Model):
    name = models.CharField(max_length=50, unique=True)
    tracker = models.IntegerField(max_length=5)
    pm = models.ForeignKey('auth.User', limit_choices_to=Q(groups__name = 'Project Manager'))


class ProjectTestCase(TestCase):
    def setUp(self):
        self.name = 'Crappy Project'
        self.tracker = 38493
        self.pm = User.objects.create_user('username', 'user@example.com', 'password')
        proj = Project.objects.create(name=self.name, tracker=self.tracker, pm=self.pm)
        proj.save()

    def test_proj_creation(self):       
        # Check stored values
        proj_zero = proj_in_db[0]
        self.assertEquals(proj_zero.name, self.name)
        self.assertEquals(proj_zero.pm, self.pm)

如果我没有将用户分配到任何组,我试图了解为什么我的测试一直通过。另外,“groups__name”记录在哪里?我无法在 Django 文档中引用它。

【问题讨论】:

    标签: django django-models django-testing


    【解决方案1】:

    groups__name 文档基本上是auth.User documentationfields lookup documentation 的组合,假设您知道auth.models.User 有一个与groups 相关的方法auth.models.Group

    limit_choices 仅限制管理员和(模型)表单中可用的选项;它不限制数据库中的选择,因此仍然可以通过编程方式设置任何可用的选择;在您的情况下,根本没有(默认)。您可以深入数据库,看看它实际上为您提供了 pm 字段的内容。

    【讨论】:

    • 您的limit_choices 解释很有道理,谢谢。我仍然不明白人们是如何提出groups__name 的。它不是一个字段,并且执行 dir(User)dir(Group) 不会将其列为属性或属性。
    • 再次阅读fields lookup documentation:您可以在属性名称后面附加两个带有查找类型的下划线; Django 会动态地把它拆开,并在幕后把它变成一个合适的查询。浏览该文档部分中给出的所有小示例(例如,headline__containsname__iexact 等)。
    【解决方案2】:

    limit_choices_to 仅限制表单中selects 中的选择(在管理员和您自己的ModelForms 中)。在您的代码中,您仍然可以分配您喜欢的任何人。

    django.contrib.auth documentation 涵盖了UserGroup 模型及其领域。

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2017-05-20
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多