将组的所有用户添加为模型字段中的选项

我试图将我的一个模型中的一个字段限制为可以选择作为特定组成员的所有用户。另一个字段为所有注册用户提供了一个选择。这在 shell 中工作正常:


>>> from django.contrib.auth.models import User, Group

>>> all_users = User.objects.all()

>>> all_users

<QuerySet [<User: somedude>, <User: test>, <User: testma>]>

>>> tm_users = User.objects.filter(groups__name='Testmanager')

>>> tm_users

<QuerySet [<User: somedude>, <User: testma>]>

但是如果我在模型中放入相同的代码:


class TestPlan(models.Model):


    all_users = User.objects.all()

    all_user_choices = ((x.username, x.get_full_name()) for x in all_users)

    tm_users = User.objects.filter(groups__name='Testmanager')

    tm_user_choices = ((x.username, x.get_full_name()) for x in tm_users)

    tp_title = models.CharField(max_length=200, verbose_name='Title')

    tp_manager = models.CharField(max_length=100, blank=True,

                                 verbose_name='Test Manager',

                                  choices=tm_user_choices)

    tp_tester = models.CharField(max_length=100, blank=True,

                                 verbose_name='Tester',

                                 choices=all_user_choices)



    def __str__(self):

        return f'{self.tp_title}'

当我执行 User.objects.all() 时它会起作用,但是当我尝试按组过滤用户时它会失败。我真的不知道我在这里做错了什么。这是错误还是功能?


哔哔one
浏览 221回答 3
3回答

心有法竹

“choices”字段属性不能是动态的,必须是静态集,例如:MONTH_CHOICES = (&nbsp; &nbsp; ("JANUARY", "January"),&nbsp; &nbsp; ("FEBRUARY", "February"),&nbsp; &nbsp; ("MARCH", "March"),&nbsp; &nbsp; # ....&nbsp; &nbsp; ("DECEMBER", "December"),)如果您需要此限制,您可以在“django 表单”或“DRF 序列化程序”逻辑中验证这种情况。

慕勒3428872

虽然我还没有找到原始问题的答案,但我已经解决了根本问题。这样做的方法是将模型字段定义为外键:class TestPlan(models.Model):&nbsp; &nbsp; tp_title = models.CharField(max_length=200, verbose_name='Title')&nbsp; &nbsp; tp_manager = models.ForeignKey(User, on_delete=models.SET_NULL,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blank=True, null=True, verbose_name='Test Manager',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; limit_choices_to={'groups__name': 'Testmanager'},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; related_name='testmanager_set')&nbsp; &nbsp; tp_tester = models.ForeignKey(User, on_delete=models.SET_NULL,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blank=True, null=True, verbose_name='Tester')limit_choices_to 参数与原始帖子中的 User.objects.filter(groups__name='Testmanager') 执行相同的操作。需要 related_name 参数,因为我现在在同一模型上有两个外键字段。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python