简体   繁体   English

将响应序列化为 django rest 框架中的嵌套字段

[英]Serialize the response as nested field in django rest framework

I had been trying to make a nested json instead of flat json.我一直在尝试制作嵌套的 json 而不是平面 json。 What I am getting is,我得到的是,

{
    "field1": "value1",
    "field2": "value2" 
}

And I am trying to make as,我正在努力使,

{
    "field1": "value1",
    "extra": {
        "x1" : "value2",
        "comment": "my comment"
    }
}

My model is simple,我的模型很简单,

class MyModel(BaseMeta):
    field1 = models.CharField(db_column='field1', primary_key=True, max_length=11)
    field2 = models.CharField(db_column='field2')

Serializer is序列化程序是

class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2']

The solution is the following,解决方法如下,

class MyModelSerializer(serializers.Serializer):
    extra = serializers.SerializerMethodField('get_extra')
    class Meta:
        model = CowMating
        fields = ['field1', 'extra']

    def get_extra(self, obj):
        return {
            'x1': obj.field2,
            'comment': 'my comments'
        }

But I am wondering if its possible to write another serializer like,但我想知道是否可以编写另一个序列化程序,例如,

class ExtraSerializer(serializers.Serializer):
    x1 = serializers.CharField(source='field2')
    comment = "my comment"

and the serializer would be in the ModelSerializer ,序列化器将在ModelSerializer

class MyModelSerializer(serializers.Serializer):
    extra = ExtraSerializer()
    class Meta:
        model = MyModel
        fields = ['field1', 'extra ']

Please give some advice.请给一些建议。 Thanks in advance.提前致谢。

Yes it's possible that you can refer another serializer in another for nested data and also there's django property that you can use.是的,您可以在另一个序列化程序中为嵌套数据引用另一个序列化程序,并且您还可以使用 django 属性

your way你的方式

class MyModelSerializer(serializers.Serializer):
    extra = ExtraSerializer()
    class Meta:
        model = MyModel
        fields = ['field1', 'extra ']
        depth = 1 .    #<--- Add this

Property财产

models.py

Suppose you have two models MyModel1 and MyModel2 which has Foreignkey relationship with the MyModel1 .假设你有两个型号MyModel1MyModel2具有与外键关系MyModel1

class MyModel1(BaseMeta):
    field1 = models.CharField(db_column='field1', primary_key=True, max_length=11)
    field2 = models.CharField(db_column='field2')
    @property
    def mymodel2_prop(self, obj):
        from appname.serializer import MyModel2Serialzers    #you have to implement a simple serializer fro MyModel2 which is imported here.
        return MyModel2Serilzers(mymodel2_set.all()).data

So you import the serializer which is optional but a good practice to validate data.因此,您导入序列化程序是可选的,但它是验证数据的好方法。 using reverse relationship you use set to get the related data in MyModel1 API使用反向关系,您使用set来获取MyModel1 API 中的相关数据

class MyModel2(BaseMeta):
        some_field1 = models.ForeignKey(MyModel1, on_delete=models.CASCADE)

serializers.py

class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'mymodel2_prop '] 

This is to give you an idea, Code is untested这是给你一个想法,代码未经测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM