복붙노트

[PYTHON] 장고 휴식 프레임 워크는 많은 분야에서 많은 serialize

PYTHON

장고 휴식 프레임 워크는 많은 분야에서 많은 serialize

어떻게 many-to-many 필드를 무언가의리스트로 직렬화하고 나머지 프레임 워크를 통해 리턴합니까? 아래의 예에서는 게시물을 태그 목록과 함께 반환하려고합니다.

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

해결법

  1. ==============================

    1.Meta에 model = Tag 클래스의 TagSerializer가 필요합니다. TagSerializer를 만든 후 ManyToManyField 관계에 대해 Many = True로 PostSerializer를 수정합니다.

    Meta에 model = Tag 클래스의 TagSerializer가 필요합니다. TagSerializer를 만든 후 ManyToManyField 관계에 대해 Many = True로 PostSerializer를 수정합니다.

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

    DRF 3에 대한 답변입니다.

  2. ==============================

    2.init 메소드의 serializer에서 queryset을 필드에 전달하고 rest_framework는 해당 queryset의 id를 계산할 수 있습니다.

    init 메소드의 serializer에서 queryset을 필드에 전달하고 rest_framework는 해당 queryset의 id를 계산할 수 있습니다.

    1) 먼저 serializer에서 serializer를 확장합니다. 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 ()을 사용하면된다.

  3. ==============================

    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')
    
  4. ==============================

    4.이것은 나를 위해 작동합니다.

    이것은 나를 위해 작동합니다.

    tag = TagSerializer(source="tag", read_only=True, many=True)
    
  5. ==============================

    5.장고 2.0

    장고 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',)
    
  6. from https://stackoverflow.com/questions/33182092/django-rest-framework-serializing-many-to-many-field by cc-by-sa and MIT license