为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哔哔one 2021-10-26 10:59:36
我试图将我的一个模型中的一个字段限制为可以选择作为特定组成员的所有用户。另一个字段为所有注册用户提供了一个选择。这在 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() 时它会起作用,但是当我尝试按组过滤用户时它会失败。我真的不知道我在这里做错了什么。这是错误还是功能?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

“choices”字段属性不能是动态的,必须是静态集,例如:


MONTH_CHOICES = (

    ("JANUARY", "January"),

    ("FEBRUARY", "February"),

    ("MARCH", "March"),

    # ....

    ("DECEMBER", "December"),

)

如果您需要此限制,您可以在“django 表单”或“DRF 序列化程序”逻辑中验证这种情况。


查看完整回答
反对 回复 2021-10-26
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

虽然我还没有找到原始问题的答案,但我已经解决了根本问题。这样做的方法是将模型字段定义为外键:


class TestPlan(models.Model):

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

    tp_manager = models.ForeignKey(User, on_delete=models.SET_NULL,

                    blank=True, null=True, verbose_name='Test Manager',

                    limit_choices_to={'groups__name': 'Testmanager'},

                    related_name='testmanager_set')

    tp_tester = models.ForeignKey(User, on_delete=models.SET_NULL,

                                  blank=True, null=True, verbose_name='Tester')

limit_choices_to 参数与原始帖子中的 User.objects.filter(groups__name='Testmanager') 执行相同的操作。需要 related_name 参数,因为我现在在同一模型上有两个外键字段。


查看完整回答
反对 回复 2021-10-26
  • 3 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号