我的Django应用程序有几种不同类型的用户。对于我的Project模型,我想将pm列限制为User对象仅属于'Project Manager'组。浏览SE&谷歌搜索了一下,我添加了'limit_choices_to'并分配了一个Q对象。
然而,当我设置一个我确定会失败的TestCase时,似乎任何用户都可以添加为pm。 Model和TestCase如下:
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文档中引用它。
答案 0 :(得分:1)
groups__name
文档基本上是auth.User documentation和fields lookup documentation的组合,假设您知道auth.models.User
有方法groups
与auth.models.Group
有关。
limit_choices
仅限制管理员和(模型)表单中的可用选项;它不限制数据库中的选择,因此任何可用的选择仍然可以以编程方式设置;在你的情况下,根本没有(默认)。你可以在数据库中查看,看看它实际上为pm
字段提供了什么。
答案 1 :(得分:0)
limit_choices_to
仅限制表单select
中的选项(在管理员和您自己的ModelForm
中)。在您的代码中,您仍然可以分配您喜欢的任何人。
django.contrib.auth
documentation涵盖了User
和Group
模型及其字段。