嵌套字段与Django REST框架进行序列化 [英] Nesting fields in serialization with Django REST framework

查看:172
本文介绍了嵌套字段与Django REST框架进行序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

鉴于我有一个这样的模型:

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

我想分组客户端_ * 字段,以便序列化的JSON将如下所示: p>

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

以下我尝试过,但不起作用,因为客户端不是一个实际的字段:

  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')
/ pre>

除了完全手动序列化,我有什么选择?我不喜欢为客户端制作一个单独的模型,因为这个数据真的属于 Case 。只读不够好。

解决方案

你可以这样尝试:

  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


Given that I have a model like this:

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)

I would like to group the client_* fields, so that the serialized JSON would look like this:

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

The following I tried, but doesn't work because client is not an actual field:

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

What options do I have except for completely manual serialization? I prefer not to make a separate model for Client because this data really belongs in Case. Read-only is not good enough.

解决方案

You can try like this:

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

这篇关于嵌套字段与Django REST框架进行序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆