django - Django 嵌套模型或序列化器
问题描述
我是 Django 的新手,我有一个简单的用例来解析嵌套的 json 文件。我的 json 文件不包含键名,我的数据类型是这样的:
<汽车工厂>:<汽车详情>
当前型号:
class CarFactory(models.Model):
name = models.CharField(max_length=60)
class CarModel(models.Model):
model = models.CharField(max_length=60)
price = models.CharField(max_length=60)
name = models.ForeignKey(CarFactory, on_delete=models.CASCADE)
这是我的输入 json 文件。
{
"BMW":[
{
"model":"3",
"price":"500"
},
{
"model":"5",
"price":"600"
}
],
"TOYOTA":[
{
"model":"X",
"price":"300"
},
{
"model":"H",
"price":"400"
},
{
"model":"S",
"price":"500"
}
]
}
当前的序列化器
class CarModelSerializer(serializers.ModelSerializer):
model: str = serializers.CharField()
price: int = serializers.IntegerField()
class Meta:
model = CarModel
fields = ("model", "price")
class CarCompanySerializer(serializers.ModelSerializer):
models = CarModelSerializer(many=True)
name = models.CharField()
class Meta:
model = CarCompany
fields = ("name", "models")
def create(self, validated_data):
car_company = CarCompany.objects.create(name=validated_data.get("name"))
for model in vaidated_data.get("models"):
car_company.models_set.create(**model)
return {"name": car_company.name}
def to_representation(self, instance):
"""Override the representation of the data"""
data = super().to_representation(instance)
return { data.get("name"): data.get("models")}
# in views
...
def post(self, request):
for (key, value) in request.data.items():
serializer = serializers.CarCompanySerializer(name=key, models=value)
serializer.is_valid(raise_expection=True)
serializer.save()
return Response(....)
解决方案
您可以通过覆盖 CarCompany 序列化程序的序列化程序来解决此问题。
# assumption you already have car company serializer and car model serializers
# serializers
class CarModelSerializer(serializers.ModelSerializer):
model: str = serializers.CharField()
price: int = serializers.IntegerField()
class Meta:
model = CarModel
fields = ("model", "price")
class CarCompanySerializer(serializers.ModelSerializer):
models = CarModelSerializer(many=True)
name = serializers.CharField()
class Meta:
model = CarCompany
fields = ("name", "models")
def create(self, validated_data):
car_company = CarCompany.objects.create(name=validated_data.get("name"))
for model in vaidated_data.get("models"):
car_company.models_set.create(**model)
return {"name": car_company.name}
def to_representation(self, instance):
"""Override the representation of the data"""
data = super().to_representation(instance)
return { data.get("name"): data.get("models")}
# in views
...
def post(self, request):
for (key, value) in request.data.items():
serializer = serializers.CarCompanySerializer(name=key, models=value)
serializer.is_valid(raise_expection=True)
serializer.save()
return Response(....)
...
推荐阅读
- node.js - Docker webpack 没有在正确的地方创建包
- kotlin - 如何将可空参数分配简化为非空参数分配?
- websocket - 对于物联网设备,物联网设备同时发生多个输出连接的机制是什么
- string - CloudFormation 字符串中允许哪些字符不带引号?
- java - 如何列出将运行哪些测试`mvn test`(没有实际运行)?
- reactjs - 在 VirtualizedMessageList 组件中显示 emojis / reactios
- javascript - 如何从数组中动态设置下拉列表的值
- tcp - TCP中的AIMD拥塞控制机制
- python - Pandas - 在基于 MultiIndex 的 DataFrame 上重新采样并使用偏移量
- c - 有没有办法排序没有。按字母顺序排列的字符数组,不使用#include
或#include ?