【问题标题】:Django - Pass variable to serializer which gets used in calculating a serializers.SerializerMethodField?Django - 将变量传递给序列化程序,用于计算序列化程序.SerializerMethodField?
【发布时间】:2022-01-22 03:02:51
【问题描述】:

所以我有这个添加属性的序列化程序。假设我想序列化 Post 数据,这就像 Facebook 或 Twitter 上的帖子。当我序列化时,可以说我想将一个变量传递给序列化程序region,因为我使用该变量来计算我想要的序列化程序中的一个属性。因此,例如,我想做PostSerializer(post_object, region='Italy') 之类的事情,它将使用region='Italy' 来计算serializers.SerializerMethodField 的属性。 如何将变量传递给用于计算serializers.SerializerMethodField() 的序列化程序?

serializer.py

class PostSerializer(serializers.ModelSerializer):
    post_count_from_region = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('author', 'body', 'created', 'updated_at', 'post_count_from_region')

    def get_post_count_from_region(self, post_obj, region:str):
        return Post.objects.filter(region=region).count()

所以对于这个用例的更明确的例子是:

view.py

def get_full_post_data_by_uuid(request, post_uuid, region: str):
    post_obj = Post.objects.get(pk=post_uuid)
    return Response(PostSerializer(post_obj, region=region).data, status=200)

【问题讨论】:

    标签: python django serialization


    【解决方案1】:

    这就是 context 在 Django 的序列化器中的用途。 context 带上一本字典,这样你就可以做到。

    PostSerializer(post_object, context={'region':'Italy'})
    

    然后在序列化器下

    def get_post_count_from_region(self, post_obj):
        region = self.context.get('region', <default value>)
        return Post.objects.filter(region=region).count()
    

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 2019-11-03
      • 2016-10-03
      • 2019-07-25
      • 1970-01-01
      • 2021-11-08
      • 2021-06-20
      • 1970-01-01
      • 2016-07-21
      相关资源
      最近更新 更多