Django rest framwork, разбор JSON
Есть модель в django файл models.py
:
class RawTransactionSale(models.Model):
summ = models.DecimalField(max_digits=19, decimal_places=2)
sign = models.CharField(max_length=12)
payments = models.JSONField(blank=False)
merchant = models.JSONField(blank=False)
class PaymentTable(models.Model):
date = models.DateTimeField()
PaymentID = models.UUIDField(default=uuid.uuid4, editable=False, blank=False)
paymentAmount = models.DecimalField(max_digits=19, decimal_places=2)
raw_transaction_sale = models.ForeignKey('RawTransactionSale', on_delete=models.CASCADE, related_name='raw_transaction_sale')
class MerchantTable(models.Model):
merchantName = models.CharField(max_length=255, blank=False)
merchantID = models.UUIDField(default=uuid.uuid4, editable=False, blank=False)
payment = models.ForeignKey('PaymentTable', on_delete=models.CASCADE, related_name='merchant')
Есть сериализаторы - файл serializers.py
:
class PaymentSerializer(serializers.ModelSerializer):
class Meta:
model = PaymentTable
fields = '__all__'
class MerchantSerializer(serializers.ModelSerializer):
class Meta:
model = MerchantTable
fields = '__all__'
class RawTransactionSaleSerializer(serializers.ModelSerializer):
class Meta:
model = RawTransactionSale
fields = '__all__'
Есть viewset
- файл views.py
:
class RawTransactionSaleViewset(viewsets.ModelViewSet):
queryset = RawTransactionSale.objects.all()
serializer_class = RawTransactionSaleSerializer
def create(self, request, *args, **kwargs):
serializer = RawTransactionSaleSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
validated_data = serializer.validated_data
payments_data = validated_data.pop('payments')
merchant_data = validated_data.pop('merchant')
merchant_serializer = MerchantSerializer(data=merchant_data)
merchant_serializer.is_valid(raise_exception=True)
merchant = merchant_serializer.save()
raw_transaction_sale = RawTransactionSale.objects.create(merchant=merchant, **validated_data)
for payment_data in payments_data:
payment_data['raw_transaction_sale'] = raw_transaction_sale.id
payment_serializer = PaymentSerializer(data=payment_data)
payment_serializer.is_valid(raise_exception=True)
PaymentTable.objects.create(raw_transaction_sale=raw_transaction_sale, **payment_serializer.validated_data)
serializer = self.get_serializer(raw_transaction_sale)
return Response(serializer.data, status=status.HTTP_201_CREATED)
На API приходит такой JSON по транзакции:
{
"summ": 1860.0,
"sign": "123456677531",
"SaleMerchID": "ca9f9c0d-c2d0-321d-8b9a-123c3fc5b543",
"merchant" : {
"merchantName": "SuperShop",
"merchantID" : "12345678-1234-abcd-dcab-123abc456def",
},
"payments": [
{
"date": "2023-04-27T15:50:15.000+0400",
"PaymentID": "4dba1234-f19e-1234-a432-ca5d15f9ec21",
"paymentAmount": 1860,
}
],
}
Пытаюсь из набора данных JSON сохранить payments в отдельную таблицу PaymentTable
, merchant
в таблицу MerchantTable
, связать с данной транзакцией и таблицу PaymentTable
привязать к таблице MerchantTable
, но получаю ошибку "{"payment":["Обязательное поле."]}"
. Где я ошибся?