Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架:在序列化程序中包含多项选择字段_Python_Django_Rest_Python 2.7_Django Rest Framework - Fatal编程技术网

Python Django Rest框架:在序列化程序中包含多项选择字段

Python Django Rest框架:在序列化程序中包含多项选择字段,python,django,rest,python-2.7,django-rest-framework,Python,Django,Rest,Python 2.7,Django Rest Framework,我正在使用Django Rest框架为我的电影模型创建一个自定义API,该模型定义如下: models.py from django.db import models class Movies(models.Model): popularity = models.FloatField() director = models.CharField(max_length = 128) GENRE_CHOICES = (('Adventure', 'Adventure'), (

我正在使用Django Rest框架为我的
电影
模型创建一个自定义API,该模型定义如下:

models.py

from django.db import models

class Movies(models.Model):
    popularity = models.FloatField()
    director = models.CharField(max_length = 128)
    GENRE_CHOICES = (('Adventure', 'Adventure'), ('Family', 'Family'), ('Fantasy', 'Fantasy'),
                        ('Musical', 'Musical'), ('Sci-Fi', 'Sci-Fi'), ('Drama', 'Drama'), ('War', 'War'),
                            ('Romance', 'Romance'), ('Comedy', 'Comedy'), ('Thriller', 'Thriller'),
                                ('Crime', 'Crime'), ('Horror', 'Horror'), ('History', 'History'), ('Family', 'Family'),
                                    ('Animation', 'Animation'), ('Short', 'Short'), ('Western', 'Western'),
                                        ('Action', 'Action'), ('Biography', 'Biography'))
    genre = models.CharField(max_length = 128, choices = GENRE_CHOICES)
    imdb_score = models.FloatField()
    movie_name = models.CharField(max_length = 500)
现在,我想允许应用程序管理员将
电影
模型的新实例输入API。我希望
类型
字段是一个多选字段,即管理员应该能够为特定电影选择多个类型

序列化程序.py

from shoppy.models import Movies
from rest_framework import serializers


class MoviesSerializer(serializers.ModelSerializer):
    #genre = serializers.CharField(max_length = 128, choices = Movies.GENRE_CHOICES)

    class Meta:
        model = Movies
        fields = ('popularity', 'director', 'genre', 'imdb_score',
                        'movie_name')
但是,在API端点,管理员只能从给定的选项列表中选择一个
类型。我确实知道,如果我使用表单,这就是我实现多选复选框的方式:

genre = forms.CharField(max_length = 1230, widget=forms.CheckboxSelectMultiple(
                                                    choices=Movies.GENRE_CHOICES))

如何在序列化程序中实现多选字段,以便管理员可以在API端点中选择多个类型

根本问题在于您的模型:

genre = models.CharField(max_length=128, choices=GENRE_CHOICES)
您的模型只允许在该列中存储单个值,因此DRF(Django Rest Framework)在API中强制执行相同的限制。如果您希望用户能够选择多种类型,最简单的解决方案是引入一种
类型
模型,该模型与
电影
具有m2m关系:

class Genres(models.Model):
    genre = models.CharField(unique=True)

class Movies(models.Model):
    genres = ManyToManyField(Genres, related_name='movies')

与您在my
models.py
中提到的上述更改相对应,我应该在my
serializers.py
中进行哪些更改?有一些例子。我一时记不起必要的改变。我做了必要的改变。但是,我仍然遇到一些bug,我在这里的后续问题中已经详细提到了这些bug: