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

但是在管理控制台上,我看到这些字段而不是字符串项:

enter image description here

但是,当我单击email_addres以查看用户详细信息时,出现以下错误:

enter image description here

编辑: 这是我的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 makemigrationsmanage.py migrate将新更改应用到数据库。 为了提高性能,您还可以将edumap_roles更改为以下内容:

class User(AbstractUser):
    CHOICES = (
        (1,(2,unique=True)
    edumap_roles = models.PositiveSmallIntegerField(choices=CHOICES)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...