gpt4 book ai didi

python - Django休息框架: Including multiple choice fields in Serializer

转载 作者:太空宇宙 更新时间:2023-11-03 17:34:28 24 4
gpt4 key购买 nike

我正在使用 Django Rest Framework 为我的 Movies 模型创建自定义 API,其定义如下:

模型.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)

现在,我希望允许应用程序管理员将 Movies 模型的新实例输入 API 中。我希望 genre 字段是一个多项选择字段,即管理员应该能够为特定电影选择多个类型。

序列化器.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 中强制执行相同的限制。如果您希望用户能够选择多种类型,最简单的解决方案是引入一个 Genres 模型,Movies 将与该模型建立 m2m 关系:

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

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

关于python - Django休息框架: Including multiple choice fields in Serializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com