首页 > 解决方案 > 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(....)

标签: djangodjango-modelsdjango-rest-framework

解决方案


您可以通过覆盖 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(....)


  ...
            
      

推荐阅读