情景:
我有一个名为" 编辑器的字段"在我的模型" 问题"如下:
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')
编辑器字段有一个选项列表,我从用户组的名称手动定义。
问题:
答案 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