以Django Rest Framework动态表单上传文档



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

因此,我使用multipart/form-data,当我只使用它上传文档时,它工作得很好,但一旦我在动态字段中输入数据,序列化程序就会停止处理数据。

示例数据:

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中处理表单数据,请尝试这个鉴于此,请继承viewsets.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)

最新更新