以Django Rest框架动态形式上载文档

以Django Rest框架动态形式上载文档,django,django-rest-framework,multipartform-data,Django,Django Rest Framework,Multipartform Data,在我的Djago React应用程序中,我正在创建一个表单,该表单具有动态字段以及上载文档的选项 为此,我使用了多部分/表单数据,当我仅使用它上载文档时,它工作正常,但一旦我在动态字段中输入数据,序列化程序就会停止处理数据 示例数据: Form Data: transaction_no: 2341 document: (binary) items[0][product]: 5 items[0][quantity]: 1 items[0][fault]: Repairable items[1][p

在我的Djago React应用程序中,我正在创建一个表单,该表单具有动态字段以及上载文档的选项

为此,我使用了
多部分/表单数据
,当我仅使用它上载文档时,它工作正常,但一旦我在动态字段中输入数据,序列化程序就会停止处理数据

示例数据:

Form Data:
transaction_no: 2341
document: (binary)
items[0][product]: 5
items[0][quantity]: 1
items[0][fault]: Repairable
items[1][product]: 4
items[1][quantity]: 2
items[1][fault]: Return
allotment: 122
答复:

{"items":[{"product":["This field is required."]},{"product":["This field is required."]}]}
序列化程序:

class DeliveredItemsSerializer(serializers.ModelSerializer):

    class Meta:
        model = DeliveredItems
        fields = "__all__"


class DeliveredSerializer(serializers.ModelSerializer):

    items = DeliveredItemsSerializer(many=True,required=False)

    class Meta:
        model = Delivered
        fields = "__all__"


    def create(self, validated_data):
        items_objects = validated_data.pop('items', None)
        prdcts = []
        try:
            for item in items_objects:
                i = DeliveredItems.objects.create(**item)
                prdcts.append(i)
            instance = Delivered.objects.create(**validated_data)
            print("prdcts", prdcts)
            instance.items.set(prdcts)
            return instance
        except:
            instance = Delivered.objects.create(**validated_data)
            return instance

    def update(self, instance, validated_data):
        items_objects = validated_data.pop('items',None)
        prdcts = []
        try:
            for item in items_objects:
                print("item", item)
                fk_instance, created = DeliveredItems.objects.update_or_create(pk=item.get('id'), defaults=item)
                prdcts.append(fk_instance.pk)
            instance.items.set(prdcts)
            instance = super(DeliveredSerializer, self).update(instance, validated_data)
            return instance
        except:
            instance = super(DeliveredSerializer, self).update(instance, validated_data)
            return instance
型号:

class DeliveredItems(models.Model):

    choices = (('Repairable', 'Repairable'),('Return', 'Return'), ('Damage', 'Damage'), ('Swap Return', 'Swap Return'))
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=0)
    fault = models.CharField(max_length=100, default="Repairable", choices=choices)

class Delivered(models.Model):

    allotment = models.ForeignKey(Allotment, on_delete=models.CASCADE)
    delivered = models.BooleanField(default=False)
    items = models.ManyToManyField(DeliveredItems)
    document = models.FileField(upload_to='delivered/', null=True, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
我如何处理列表中没有的动态数据,这些动态数据类似于下面的
items[0][product]:5

我需要以下格式的数据:

{
  "transaction_no": 2335,
  "delivered": false,
  "document": {
    "uid": "rc-upload-1599739825759-7"
  },
  "items": [
    {
      "product": 4,
      "quantity": "12",
      "fault": "Repairable"
    },
    {
      "product": 5,
      "quantity": "1",
      "fault": "Return"
    }
  ],
  "allotment": 116
}

如果您想在DRF中处理表单数据,请尝试此方法 在视图中,请继承
viewset.ModelViewSet

  def dict_shallow_copy(d):
   return dict(d.items())      
  def get_serializer(self, *args, **kwargs):
    if "data" in kwargs:
        data = kwargs.get("data", {})
        if isinstance(data, dict):
            data = dict_shallow_copy(data)
            //get your data here, sameple like this
            data['items'] = self.kwargs
            data['transaction_no'] = self.kwargs
            kwargs['data'] = data
        else:
            raise ValidationError("Invalid data type")
    return super().get_serializer(*args, **kwargs)

如果您想在DRF中处理表单数据,请尝试此方法 在视图中,请继承
viewset.ModelViewSet

  def dict_shallow_copy(d):
   return dict(d.items())      
  def get_serializer(self, *args, **kwargs):
    if "data" in kwargs:
        data = kwargs.get("data", {})
        if isinstance(data, dict):
            data = dict_shallow_copy(data)
            //get your data here, sameple like this
            data['items'] = self.kwargs
            data['transaction_no'] = self.kwargs
            kwargs['data'] = data
        else:
            raise ValidationError("Invalid data type")
    return super().get_serializer(*args, **kwargs)

您希望的请求数据是什么?@CuongDaoVan我希望数据采用JSON格式将其转换为JSON:@CuongDaoVan是否有更面向后端的解决方案?您可以在ViewSet中以表单的形式获取数据,并以dict的形式处理表单您希望的请求数据是什么?@CuongDaoVan我希望数据采用JSON格式格式将其转换为json:@CuongDaoVan是否有更面向后端的解决方案?您可以在视图集中以表单的形式获取数据,并以dict的形式处理表单