115

多対多のフィールドを何かのリストにシリアル化し、残りのフレームワークを介してそれらを返すにはどうすればよいですか? 以下の例では、関連するタグのリストとともに投稿を返そうとしています。

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"??)

ビュー.py

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
4

10 に答える 10

144

が必要TagSerializerです。が作成されたら、リレーションのwithを変更します。class Metamodel = TagTagSerializerPostSerializermany=TrueManyToManyField

class PostSerializer(serializers.ModelSerializer):
    tag = TagSerializer(read_only=True, many=True)

    class Meta:
        model = Post
        fields = ('tag', 'text',)

答えはDRF 3です

于 2015-10-17T02:53:21.760 に答える
35

これは私がやったことです。本が複数の著者を持つことができ、著者が複数の本を持つことができるとしましょう: モデルについて:

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')
于 2018-07-04T15:45:22.490 に答える
4

これは私にとってはうまくいきます。

tag = TagSerializer(source="tag", read_only=True, many=True)
于 2016-08-09T12:36:57.597 に答える
4

ジャンゴ 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',)
于 2018-03-27T00:29:33.803 に答える
2

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>

通常のようにフィルターまたは除外を使用して、任意の引数の下でそのフィールドのクエリセットを制限できます。すべてを含めたい場合は、.objects.all() を使用するだけです

于 2016-10-01T21:34:01.743 に答える