Python Django:如何获取用户组列表并使用该列表(字典)作为模型字段的选择选项?

Python Django:如何获取用户组列表并使用该列表(字典)作为模型字段的选择选项?,python,django,django-models,modelchoicefield,Python,Django,Django Models,Modelchoicefield,场景: 我的模型“问题”中有一个名为“编辑器”的字段,如下所示: CHOICE_LIST = (('0', 'Undefined'), ('staffGroup', 'staffGroup'), ('staffGroup02', 'staffGroup02'), ('staffGroup03', 'staffGroup03'), ('staffGroup04', 'staffGroup04'), ('staffGroup05', 'staffGroup05'),) editor = models

场景

我的模型“问题”中有一个名为“编辑器”的字段,如下所示:

CHOICE_LIST = (('0', 'Undefined'), ('staffGroup', 'staffGroup'), ('staffGroup02', 'staffGroup02'), ('staffGroup03', 'staffGroup03'), ('staffGroup04', 'staffGroup04'), ('staffGroup05', 'staffGroup05'),)
editor = models.CharField(max_length=350, default=0, choices=CHOICE_LIST, verbose_name='Responsibility')
编辑器字段有一个我根据用户组名称手动定义的选项列表

问题:

  • 如何直接从auth_grup表生成列表
  • 我怎样才能有选择地做到这一点(因为我可能不需要全部,我只需要那些以“staff”字符串开头的组)
  • 如何使此列表成为静态的(因此从用户组中删除条目可能不会将其从列表中删除)或动态的(将随auth\u group表中的更改动态更新列表)

  • Re 1:您可以使用返回所有组的callable。例如:

    def getGroupNames():
        return Group.objects.all().values_list('name', flat=True)
    
    您仍然需要将其转换为一个元组('short-name','human-readable name')

    如果希望元组中的全名与短名称和人类可读名称相同,可以执行以下操作:

    def getGroupNames():
        groups = Group.objects.all().values_list('name', flat=True)
        return zip(groups, groups)
    
    然后在选择字段中使用相同的选项

    editor = models.CharField(max_length=350, default=0, choices=getGroupNames(), verbose_name='Responsibility')
    
    回复2:你可以过滤你的查询

    def getGroupNames():
        return Group.objects.filter(name__starts_with='staff').values_list('name', flat=True)
    
    使用选项是一种展示便利。没有限制 可以发送到数据库的值,甚至来自 前端。例如,如果使用浏览器的“检查”功能,则 可以编辑下拉列表,更改其中一个值并提交。 然后,后端视图将愉快地使用它并将其保存到 数据库

    这意味着你仍然能够做到这一点

    obj = SomeModel.objects.get(pk=1)
    obj.editor = 'Random Value not part of choices'
    obj.save()
    
    Re3:上面提到的可调用技术是静态的,还是动态的,取决于您编写它的目的;在进行迁移时,将对该函数进行评估,并将这些值作为选项添加到迁移文件中。但是,围绕此模型编写的任何序列化程序或表单都将一次又一次地评估选择


    参考资料:

    关于#1:我如何将其转换为一个touple?如果“短名称”和“人类可读名称”相同,我没有问题。关于#2:突出显示的部分不清楚,可能是因为我使用forms.py收集数据。你能给我一些关于这方面的参考资料吗?这样我就可以搜索或阅读更多关于这方面的内容了?谢谢!从你的回答中学到了很多:)@mahmudKabir Re 1:只需使用拉链;用相同的Re 2更新了我的答案:突出显示的部分表示,即使您使用了选项,Django也不会阻止您为模型对象上的该字段设置值。Django表单、管理员和序列化程序将限制您,但模型本身不会阻止保存非选择值!