Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将响应序列化为django rest框架中的嵌套字段_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

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

Python 将响应序列化为django rest框架中的嵌套字段,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我一直试图制作一个嵌套的json而不是平面json。我得到的是 { "field1": "value1", "field2": "value2" } 而我正努力使自己成为 { "field1": "value1", "extra": { "x1" : "value2", "comment": "my comment" } } 我的模型很简单 class MyModel(BaseMeta): field1 = m

我一直试图制作一个嵌套的json而不是平面json。我得到的是

{
    "field1": "value1",
    "field2": "value2" 
}
而我正努力使自己成为

{
    "field1": "value1",
    "extra": {
        "x1" : "value2",
        "comment": "my comment"
    }
}
我的模型很简单

class MyModel(BaseMeta):
    field1 = models.CharField(db_column='field1', primary_key=True, max_length=11)
    field2 = models.CharField(db_column='field2')
序列化程序是

class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'field2']
解决办法如下:

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'
        }
但我想知道是否有可能编写另一个序列化程序,如

class ExtraSerializer(serializers.Serializer):
    x1 = serializers.CharField(source='field2')
    comment = "my comment"
序列化程序将位于
ModelSerializer

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

请给我一些建议。提前感谢。

是的,您可以在另一个序列化程序中引用另一个序列化程序以获取嵌套数据,并且可以使用django

你的方式

class MyModelSerializer(serializers.Serializer):
    extra = ExtraSerializer()
    class Meta:
        model = MyModel
        fields = ['field1', 'extra ']
        depth = 1 .    #<--- Add this
因此,导入序列化程序是可选的,但这是验证数据的良好实践。使用反向关系,您可以使用
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 '] 

这是给你一个想法,代码未经测试

我试着把@property def extra(self):return{}。它不起作用。你能告诉我更多吗?谢谢@ans2human,问题是我没有两个模型,也没有数据库关系。我只想在嵌套的json中添加一个额外的字段。属性不依赖于关系,您可以使用属性添加任何数据。否则,我总结的方法就是要走的路。拥有
超序列化程序
的好处是什么?在这里,您可以通过
SerializerMethodField
:)简单地实现您想要的内容,并且还有额外的空间。字段=['field1','extra']=>fields=['field1','extra']
class MyModelSerializer(serializers.Serializer):
    class Meta:
        model = MyModel
        fields = ['field1', 'mymodel2_prop ']