多対多のフィールドを何かのリストにシリアル化し、残りのフレームワークを通じてそれらを返すにはどうすればよいですか?以下の私の例では、投稿とそれに関連付けられたタグのリストを返そうとします。
models.py
class post(models.Model):
tag = models.ManyToManyField(Tag)
text = models.CharField(max_length=100)
serializers.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ("text", "tag"??)
views.py
class PostViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
TagSerializer
が必要です。そのclass Meta
にはmodel = Tag
があります。 TagSerializer
が作成されたら、PostSerializer
関係のManyToManyField
をmany=True
で変更します。
class PostSerializer(serializers.ModelSerializer):
tag = TagSerializer(read_only=True, many=True)
class Meta:
...
これは私がやったことです。Bookには複数の著者を含めることができ、Authorには複数の書籍を含めることができます。
class Author(models.Model):
name = models.CharField(max_length=100, default="")
last_name = models.IntegerField(default=0)
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name="book_list", blank=True)
name = models.CharField(max_length=100, default="")
published = models.BooleanField(default=True)
シリアライザー:
class BookSerializer(serializers.ModelSerializer):
authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True)
class Meta:
model = Book
fields = ('id', 'name', 'published', 'authors')
class AuthorSerializer(serializers.ModelSerializer):
book_list = BookSerializer(many=True, read_only=True)
class Meta:
model = Author
fields = ('id', 'name', 'last_name', 'book_list')
initメソッドのシリアライザーでは、クエリセットをフィールドに渡し、rest_frameworkがそのクエリセットのIDを検証できます
1)最初にserializers.ModelSerializerからシリアライザーを拡張します
class YourSerializer(serializers.ModelSerializer):
2)メタクラスにフィールドを含める
class YourSerializer(serializers.ModelSerializer):
class Meta:
fields = (..., 'your_field',)
3)initメソッド内:
def __init__(self, *args, **kwargs):
super(YourSerializer, self).__init__(*args, **kwargs)
self.fields['your_field].queryset = <the queryset of your field>
通常のように、filterまたはexcludeを使用して、任意の引数の下でそのフィールドのクエリセットを制限できます。すべてを含める場合は、.objects.all()を使用します
Django 2.0
多対多のフィールドで、特定のフィールドが必要な場合:
class QuestionSerializer(serializers.ModelSerializer):
topics_list = serializers.SerializerMethodField()
def get_topics_list(self, instance):
names = []
a = instance.topics.get_queryset()
for i in a:
names.append(i.desc)
return names
class Meta:
model = Question
fields = ('topics_list',)
これは私のために動作します。
tag = TagSerializer(source="tag", read_only=True, many=True)