DRF: условно изменить сериализатор - PullRequest
0 голосов
/ 10 марта 2020

Я использую Django 3.0, и у меня есть сериализатор, использующий django-rest-framework. Скажем, например, у меня есть Forum объект. Каждый forum имеет owner, который является пользователем.

В моей GET /forums/ конечной точке я бы хотел иметь owner_id. Однако в моей GET /forums/<forum_id>/ конечной точке я хотел бы вернуть весь внедренный объект.

Есть ли способ, чтобы один сериализатор поддерживал оба этих сценария ios? Если нет, я бы не хотел делать два сериализатора только для поддержки этого.

class ForumSerializer(serializers.ModelSerializer, compact=True):

    if self.compact is False:
        owner = UserSerializer(source='owner', read_only=True)
    else:
        owner_id = serializers.UUIDField(source='owner_id')
    ...
    How can I achieve this compact thing?

    class Meta:
        fields = [...]
        read_only_fields = ['owner', 'owner_id']

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вы можете добавить SerializerMethodField следующим образом:

class ForumSerializer(serializers.ModelSerializer):

    owner = serializer.SerializerMethodField()

    def get_owner(self, obj):
       if self.context['is_compact'] == True:
           return obj.owner.pk
       else:
           return UserSerializer(obj.owner).data

    class Meta:
        model = YourModel
        fields = '__all__'


# Usage in view

serializer = ForumSerializer(context={'is_compact':True})

Я передаю is_compact значение через serializer's extra context.

0 голосов
/ 10 марта 2020

создать два класса сериализатора

class ForumSerializerId(ModelSerializer):
     class Meta:
          model = Forum
          fields = ['forum_id']

class ForumSerializerDetail(ModelSerializer):
     class Meta:
          model = Forum

на вашем view.py

forums(request):
   forum_list = Forum.objects.all()
   forum_serializer = ForumSerializerId(forum_list,many=True) 
   return Response({"form":forum_serializer.data})

forum_detail(request,pk):
   forum = get_object_or_404(Forum,pk)
   forum_serializer = ForumSerializerDetail(forum)
   return Response({"form":forum_serializer.data})
...