如何解决在Django rest框架中获取MultipleChoiceField的FieldError
我正在尝试使用django Rest Framework字段中的MultipleChoiceField,如此链接中所述: https://pypi.org/project/django-multiselectfield/
我的一部分代码如下:
from rest_framework import fields
CHOICES = (
('publisher','Can Publish programs'),('author','Can author programs')
)
class User(AbstractUser):
email = EmailField(verbose_name=_('email address'),unique=True)
edumap_roles = fields.MultipleChoiceField(choices=CHOICES,allow_blank=True)
但是,当我单击email_addres以查看用户详细信息时,出现以下错误:
编辑: 这是我的UserAdmin类
@register(User)
class UserAdmin(CustomAdmin):
"""Define admin model for custom User model with no email field."""
fieldsets = (
(None,{'fields': ('email','password')}),(_('Personal info'),{'fields': ('first_name','last_name')}),(_('Permissions'),{'fields': ('is_active','is_staff','is_superuser','groups','user_permissions','edumap_roles')}),(_('Important dates'),{'fields': ('last_login','date_joined','created_at','updated_at')}),)
add_fieldsets = (
(None,{
'classes': ('wide',),'fields': ('email','password1','password2'),}),)
list_display = ('email','first_name','last_name','edumap_roles')
search_fields = ('email','last_name')
ordering = ('email',)
readonly_fields = ['created_at','updated_at']
我的其余框架版本是:3.11.0。我是否想添加任何东西?
解决方法
当然,数据库域中不存在“多选字段”。在幕后,这就像一个CharField,但有一些额外的序列化。这意味着在模型定义中,我们需要这样定义它:
CHOICES = (
('publisher','Can Publish programs'),('author','Can author programs')
)
class User(AbstractUser):
email = EmailField(verbose_name=_('email address'),unique=True)
edumap_roles = models.CharField(choices=CHOICES,null=True,blank=False)
但是,Django尚不知道这需要多项选择。我们需要为此创建一个表单。在表格中,我们可以指定每种字段应使用哪种widget
。例如。我们可以指定它应该使用textarea而不是普通的文本输入。您的表格可能类似于:
class UserForm(forms.ModelForm):
edumap_roles = forms.MultipleChoiceField(widget=forms.SelectMultiple,choices=choices)
class Meta:
model = User
fields = [
'email','edumap_roles','password1','password2','...',]
请注意,我们只需要为我们要覆盖的字段指定小部件。其他小部件会自动解决。
然后在您的UserAdmin中可以执行以下操作:
@register(User)
class UserAdmin(CustomAdmin):
...
form = UserForm
表单和窗口小部件是“管理”部分的重要组成部分,您可以在此处阅读更多内容:
https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/(有不同类型的表单,但是在这里ModelModel似乎合适)
https://docs.djangoproject.com/en/3.1/ref/forms/widgets/#module-django.forms.widgets
如果要在数据库中保存数据状态,则必须使用Django字段。您可以使用Django CharField
代替rest_framework
字段来解决问题。您可以使用以下代码代替当前字段:
from django.db import models
class User(AbstractUser):
CHOICES = (
('publisher','Can author programs')
)
email = models.EmailField(verbose_name=_('email address'),unique=True)
edumap_roles = models.CharField(choices=CHOICES)
注意:不要忘记运行manage.py makemigrations
和manage.py migrate
将新更改应用到数据库。
为了提高性能,您还可以将edumap_roles
更改为以下内容:
class User(AbstractUser):
CHOICES = (
(1,(2,unique=True)
edumap_roles = models.PositiveSmallIntegerField(choices=CHOICES)