【问题标题】:DRF: Conditially change serializerDRF:有条件地更改序列化程序
【发布时间】:2020-03-10 16:40:01
【问题描述】:

我正在使用 Django 3.0,并且我有一个使用 django-rest-framework 的序列化程序。假设例如我有一个Forum 对象。每个forum 都有一个owner,它是一个用户。

在我的GET /forums/ 端点中,我只想拥有owner_id。但是,在我的 GET /forums/<forum_id>/ 端点中,我想返回整个嵌入对象。

有没有办法让一个序列化程序同时支持这两种情况?如果没有,我不想为了支持这个而不得不制作两个序列化程序。

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']

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

您可以像这样添加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})

我通过serializer's extra context 传递is_compact 值。

【讨论】:

  • 看起来如果我要返回 ID,owner 的后缀应该是 owner_id
  • 另外,owner_idobj.owner.pk 应该返回相同的值
【解决方案2】:

创建两个序列化器类

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})

【讨论】:

  • 我希望避免这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多