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

时间:2018-04-16 14:43:06

标签: python django django-models modelchoicefield

情景

我有一个名为" 编辑器的字段"在我的模型" 问题"如下:

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')

编辑器字段有一个选项列表,我从用户组的名称手动定义。

问题:

  1. 如何直接从auth_grup表生成列表?
  2. 我如何选择这样做(因为我可能不需要所有这些,我只需要那些以' 员工'字符串开头)的小组
  3. 如何将此列表静态(因此从用户组中删除条目可能无法将其从列表中删除) 动态(将使用auth_group表中的更改动态更新列表?)

1 个答案:

答案 0 :(得分:0)

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()

Re 3:上面提到的可调用技术是静态的或动态的,就像你写的那样;进行迁移时将评估此函数,并将值作为选项添加到迁移文件中。但是,您在此模型周围编写的任何序列化程序或表单都会一次又一次地评估选择。

参考:https://zindilis.com/blog/2017/05/04/django-backend-validation-of-choices.html