【问题标题】:Django-Rest-Framework: Serializing Many to Many Model with a through in Post RequestDjango-Rest-Framework:通过 Post 请求序列化多对多模型
【发布时间】:2020-11-18 23:13:14
【问题描述】:

我在尝试在 DRF 和序列化程序中实现对 POST 请求的处理时遇到了很大的麻烦。我遇到的错误如下;

当我尝试调试问题时,偶尔会成功处理请求。我真的很困惑。

AttributeError:尝试获取值时出现 AttributeError 序列化程序FreightCreateSerializer 上的字段equipment_types。这 序列化器字段可能命名不正确且不匹配任何 Freight 实例上的属性或键。原始异常文本 原为:“Freight”对象没有“FreightEquipmentType_set”属性。

我的模特是;

    class EquipmentType(model.Model):  
        name = models.CharField(max_length=100)
        description = models.CharField(max_length=250)
    
    class Freight(model.Model):
        name = models.CharField(max_length=250)
        equipment_types = models.ManyToManyField(EquipmentType, through='FreightEquipmentType')    

    class FreightEquipmentType(model.Model):
    
        equipment_type = models.ForeignKey(
            EquipmentType,
            on_delete=models.CASCADE
        )
        freight = models.ForeignKey(
            Freight,
            on_delete=models.CASCADE
        )
        quantity = models.DecimalField(max_digits=18, decimal_places=2, default= 0)

我的序列化器是,

class EquipmentTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = EquipmentType
        fields = "__all__"

class FreightEquipmentTypeSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = FreightEquipmentType
        fields = ('equipment_type', 'quantity', )

class FreightCreateSerializer(serializers.ModelSerializer):

    equipment_types = FreightEquipmentTypeSerializer(many=True, source='FreightEquipmentType_set', read_only=False)

    class Meta:
        model = Freight
        fields = "__all__"


    def create(self, validated_data):
        equipment_types_validated_data = validated_data.pop('FreightEquipmentType_set')
        freight = Freight.objects.create(**validated_data)
        equipment_type_serializer = self.fields['equipment_types']
        for each in equipment_types_validated_data:
            each['freight'] = freight
        equipment_types = equipment_type_serializer.create(equipment_types_validated_data)
        return freight

我想处理以下发帖请求。

{
  "name": "0",
  "equipment_types": [{
        "equipment_type": "8a9c1f57-c6c9-4bfa-84a8-2082d6c3d112",
        "quantity": 2
    }, {
        "equipment_type": "7242a8fb-3eba-4988-98fa-806c21562101",
        "quantity": 3
    }]
}

非常感谢任何帮助。

【问题讨论】:

    标签: django post serialization django-rest-framework many-to-many


    【解决方案1】:

    经过数小时的研究和试验。终于找到一篇博文了。

    https://adnankayace.blogspot.com/2019/03/django-rest-framework-many-to-many_21.html

    它解决了我的问题。希望它也对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2013-11-27
      • 1970-01-01
      • 2021-07-09
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2021-06-12
      相关资源
      最近更新 更多