Django Rest Framework - как настроить поле сериализатора - PullRequest
0 голосов
/ 23 января 2020

Я сейчас работаю над DRF.

models.py

class Post(models.Model):
    id = models.IntegerField()
    content = models.CharField()
    category = models.CharField()
    created = models.CharField()

Ниже приведен ответ, который я хочу получить

[
    {
      "id": "1",
      "content": "a",
      "category": "post",
      "created": "2020-01-23"
    },
    {
      "id": "3",
      "content": "b"
    },
]

Как я могу получить ответ как выше только с использованием ОДНОЙ модели.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Так что в основном вам нужно сначала взглянуть на https://www.django-rest-framework.org/api-guide/serializers/#modelserializer.

Надеюсь, этот пример поможет вам:

view.py

class PostListView(BaseApiView):
    serializer_class = PostListSerializer

    def get(self, request, *args, **kwargs):
        posts = list(Post.objects.all())
        res = PostListSerializer(posts, many=True)
        return Response(res.data)

serializers.py

class PostListSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        data = super(PostListSerializer, self).to_representation(instance)
        if not data.get('category'):
            data.pop('category', None)
            data.pop('created', None)
        return data

    class Meta:
        model = Post
        fields = '__all__'
0 голосов
/ 23 января 2020

Вы можете использовать динамический c сериализатор и сделать что-то вроде этого:

serializers.py

class PostSerializer(DynamicFieldsModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'content', 'category', 'created']

views.py

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import PostSerializer


class PostListView(APIView):
    def get(self, request, format=None):
        post1 = Post.objects.get(id=1)
        post3 = Post.objects.get(id=3)
        post1_serializer = PostSerializer(post1)  # all fields
        post3_serializer = PostSerializer(post3, fields=['id', 'content'])
        data = [post1_serializer.data, post3_serializer.data]
        return Response(data, status=status.HTTP_200_OK)
...