development

다 대다 필드를 직렬화하는 Django 나머지 프레임 워크

big-blog 2020. 12. 30. 20:14
반응형

다 대다 필드를 직렬화하는 Django 나머지 프레임 워크


다 대다 필드를 무언가 목록으로 직렬화하고 나머지 프레임 워크를 통해 반환하는 방법은 무엇입니까? 아래 예제에서는 관련된 태그 목록과 함께 게시물을 반환하려고합니다.

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가 생성 된 관계에 대해 PostSerializerwith many=True수정합니다 ManyToManyField.

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

    class Meta:
        ...

답은 DRF 3입니다.


이것이 제가 한 일입니다. 한 책이 한 명 이상의 저자를 가질 수 있고 한 명의 저자가 한 권 이상의 책을 가질 수 있다고 가정 해 보겠습니다. 모델 :

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 메서드 의 serializer에서 쿼리 세트를 필드에 전달할 수 있으며 rest_framework는 해당 쿼리 세트의 ID를 검증합니다.

1) 먼저 serializer에서 serializer를 확장하십시오.

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 () 사용하십시오.


장고 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)

@Brian의 답변 "태그"에 추가 : [{ "name": "tag1"}]는 다음과 같이 "태그": [ "tag1", "tag2", ...]로 단순화 할 수 있습니다.

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

    class Meta:
        ...

class TagSerializer(serializers.RelatedField):

     def to_representation(self, value):
         return value.name

     class Meta:
        model = Tag

자세한 정보 : https://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields

참조 URL : https://stackoverflow.com/questions/33182092/django-rest-framework-serializing-many-to-many-field

반응형