0

场景

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

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. 我怎样才能有选择地做到这一点(因为我可能不需要所有这些,我可能只需要那些以' staff '字符串开头的组)
  3. 如何使此列表成为静态(因此从用户组中删除条目可能不会将其从列表中删除) 动态(将随着 auth_group 表中的更改动态更新列表)?
4

1 回答 1

0

Re 1:您可以使用返回所有组的可调用对象。例子:

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

于 2018-04-16T15:06:35.203 回答