Python Django Rest框架:在序列化程序中包含多项选择字段
我正在使用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'), (
电影
模型创建一个自定义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')
与您在mymodels.py
中提到的上述更改相对应,我应该在myserializers.py
中进行哪些更改?有一些例子。我一时记不起必要的改变。我做了必要的改变。但是,我仍然遇到一些bug,我在这里的后续问题中已经详细提到了这些bug: