Python 将响应序列化为django rest框架中的嵌套字段
我一直试图制作一个嵌套的json而不是平面json。我得到的是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
{
"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 ']