[英]How to deserialize nested related JSON Data with django-rest-framework?
[英]Django - How to deserialize json into a nested object
我有以下问题。 我需要使用json中的POST数据创建一个复杂的对象。 在models.py文件中,我有一个名为“Company”的主对象:
class Company(models.Model):
name = models.CharField(max_length=255)
descr = models.CharField(max_length=255)
def __str__(self):
return self.name
然后我有“建筑”:
class Building(models.Model):
name = models.CharField(max_length=255)
city = models.CharField(max_length=255)
location = models.TextField()
company= models.ForeignKey("Company", related_name="buildings", on_delete=models.CASCADE)
等等其他几个类(即“Floor”,“Area”,“Room”)。
我从POST请求得到的json是:
{
"id": 1,
"buildings": [{
"id": 3,
"floors": [{
"id": 1,
"floor": -1,
"descr": "underground",
"building": 3
}],
"areas": [{
"id": 1,
"rooms": [{
"id": 1,
"floor": 1,
"area": 1,
"descr": "First Room"
}],
"descr": "Dev area",
"building": {
"id": 3,
"name": "Sede",
"city": "Rome",
"location": "mylocation",
"company": {
"id": 1,
"name": "Test",
"descr": "Test"
}
}
}],
"name": "Sede",
"city": "Rome",
"location": "mylocation",
"company": 1
}],
"name": "Test",
"descr": "Test"
}
当我尝试从json创建一个“Company”对象时,它只创建以下内容:
{
"id": 1,
"buildings": [],
"name": "Test",
"descr": "Test"
}
而不是完整的结构。
我的序列化器如下:
class BuildingSerializer(serializers.ModelSerializer):
floors= FloorSerializer(read_only=True, many=True)
areas = AreaSerializer(read_only=True, many=True)
class Meta:
model = Building
fields = '__all__'
read_only_fields = ('id',)
class CompanySerializer(serializers.ModelSerializer):
buildings= BuildingSerializer(read_only=True, many=True)
class Meta:
model = Company
fields = '__all__'
read_only_fields = ('id',)
我该如何解决这个问题?
PS我知道json有点多余!
没有获得嵌套数据的99%的时间是因为您正在发送具有表单内容类型的JSON有效内容。
通过将Content-Type标头设置为application/json
来明确您的客户端发送JSON,这应该可以解决内容问题。
您将建筑物指定为只读字段: http : //www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields
尝试在序列化程序中删除该参数:
class BuildingSerializer(serializers.ModelSerializer):
floors= FloorSerializer(many=True)
aree = AreaSerializer(many=True)
class Meta:
model = Building
fields = '__all__'
read_only_fields = ('id',)
class CompanySerializer(serializers.ModelSerializer):
buildings= BuildingSerializer(many=True)
class Meta:
model = Company
fields = '__all__'
read_only_fields = ('id',)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.