【问题标题】:Nesting fields in serialization with Django REST framework使用 Django REST 框架在序列化中嵌套字段
【发布时间】:2014-11-30 19:48:47
【问题描述】:

鉴于我有这样的模型:

class Case(models.Model):
    opened = models.DateTimeField(auto_now_add=True)
    client_first_name = models.CharField(max_length=50)
    client_last_name = models.CharField(max_length=50)

我想对client_* 字段进行分组,以便序列化的 JSON 如下所示:

{
    "opened": "2014-10-05T19:30:48.667Z",
    "client": {
        "first_name": "John",
        "last_name": "Doe"
    }
}

我尝试了以下方法,但不起作用,因为client 不是实际字段:

class ClientSerializer(serializers.ModelSerializer):

    class Meta:
        model = Case
        fields = ('client_first_name', 'client_last_name')


class CaseSerializer(serializers.ModelSerializer):
    client = ClientSerializer()

    class Meta:
        model = Case
        fields = ('opened', 'client')

除了完全手动序列化之外,我还有哪些选择?我不想为Client 制作单独的模型,因为这些数据确实属于Case。只读是不够的。

【问题讨论】:

  • @brawaga 这不是一个真正的答案,因为它是“完全手动序列化”,我写道我正在寻找除此之外的其他选项。不管怎么说,还是要谢谢你;很高兴得到作者的意见。
  • @Dien,基于不是答案,而是在底部的顶部帖子更新,您可以构建一个不违反 DRY 的解决方案,这不会是完全的,而是半手动序列化,只是因为解决方案是操纵validated_data 和instance,可能还有更多。它会双向工作。
  • @brawage 啊,你说得对——我把“答案”也从字面上理解了。里面可能有东西。虽然我同意汤姆的观点,他的版本更具可读性。

标签: django django-rest-framework


【解决方案1】:

你可以这样试试:

class CaseSerializer(serializers.ModelSerializer):
    client = serializers.SerializerMethodField('client')

    class Meta:
        model = Case
        fields = ('opened', 'client')

    def client(self, obj):
        client_fields = {}
        client_fields['first_name'] = obj.client_first_name
        client_fields['last_name'] = obj.client_last_name
        return client_fields

【讨论】:

  • 它并不完全有效,但我明白了。不幸的是,它本质上是只读的,我需要完整的 CRUD 支持。
  • 哇!我忘了。是的,SerializerMethodField 是只读的。我已经大量使用了它,但是对于只读 Web 服务,所以我没有立即想到您还需要 post 和 put 方法。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 2018-12-13
  • 2016-05-04
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 2016-08-01
  • 2014-07-26
相关资源
最近更新 更多