【问题标题】:Return nested serializer in serializer method field在序列化器方法字段中返回嵌套序列化器
【发布时间】:2016-02-29 22:24:23
【问题描述】:

我有一个名为followers 的方法字段。我在SerializerMethodField 中获得了关注者列表:

followers = serializers.SerializerMethodField()

我想使用名为BaseUserSmallSerializer 的特定序列化程序格式化结果。我应该如何实现方法get_followers 来实现?

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    试试这个;

    followers = BaseUserSmallSerializer(source='get_followers', many=True)
    

    你可以在方法域中使用序列化器;

    def get_followers(self, obj):
       followers_queryset = #get queryset of followers
       return  BaseUserSmallSerializer(followers_queryset, many=True).data
    

    【讨论】:

    • 它不起作用,因为followers 不是我的类 BaseUser 的属性。我得到:Original exception text was: 'BaseUser' object has no attribute 'get_following'.
    • 好的,您可以编写模型方法,也可以在 serializerMethod 字段中使用 BaseUserSmallSerializer。
    • 好的,我明白了。感谢您快速而完整的回答。作为记录,解决方案 2 是我正在寻找的。​​span>
    • 如果你得到你的序列化器不是 json 可序列化的错误,你可能没有在序列化器上调用数据属性。 BaseUserSmallSerializer(followers_queryset, many=True).data
    • @Geo Jacob 上帝保佑你。谢谢
    【解决方案2】:

    如果您更喜欢通用解决方案

    SerializerMethodNestedSerializer,其工作方式与序列化程序相同。SerializerMethodField 但使用传递的序列化程序包装结果并返回 dict

    class SerializerMethodNestedSerializer(serializers.SerializerMethodField):
        """Returns nested serializer in serializer method field"""
    
        def __init__(self, kls, kls_kwargs=None, **kwargs):
            self.kls = kls
            self.kls_kwargs = kls_kwargs or {}
            super(SerializerMethodNestedSerializer, self).__init__(**kwargs)
    
        def to_representation(self, value):
            repr_value = super(SerializerMethodNestedSerializer, self).to_representation(value)
            if repr_value is not None:
                return self.kls(repr_value, **self.kls_kwargs).data
    

    用法

    class SomeSerializer(serializers.ModelSerializer):
        payment_method = SerializerMethodNestedSerializer(kls=PaymentCardSerializer)
    
        def get_payment_method(self, obj):
            return PaymentCard.objects.filter(user=obj.user, active=True).first()
    
        class Meta:
            model = Profile
            fields = ("payment_method",)
    
    class PaymentCardSerializer(serializers.ModelSerializer):
    
        class Meta:
            fields = ('date_created', 'provider', 'external_id',)
            model = PaymentCard
    
    

    SerializerMethodNestedSerializer(kls=PaymentCardSerializer)预期输出

    None or {'date_created': '2020-08-31', 'provider': 4, 'external_id': '123'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多