{'required': 'Это поле обязательно для заполнения.', 'null': 'Это поле не может быть нулевым.', 'invalid': 'Неверные данные. Ожидали словарь, а получили {datatype}.'}
Это ошибка, которую выдает serializer.is_valid(). Я не знаю, почему возникает эта ошибка. Я новичок в Django Rest Framework. Я пытаюсь сделать простой api для генерации счетов, который принимает информацию о продавце, покупателе, товарах и генерирует счет. Поэтому я пишу модели для каждого и одну модель для инвойса, в которой продавец, покупатель являются внешними ключами. Модель товара связана с моделью счета через внешний ключ. Любая помощь будет принята с благодарностью.
Это мой models.py
class Seller(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
phone = models.CharField(max_length=12)
address = models.CharField(max_length=200)
def __str__(self):
return self.name
class Buyer(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
phone = models.CharField(max_length=12)
address = models.CharField(max_length=200)
def __str__(self):
return self.name
class Invoice(models.Model):
id = models.AutoField(primary_key=True)
seller = models.ForeignKey(Seller, on_delete=models.CASCADE)
buyer = models.ForeignKey(Buyer, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True)
def total_amount(self):
total = Decimal('0.00')
for item in self.items.all():
total = total + item.total()
return total
def invoice_number(self):
if len(str(self.id))==1:
return 'Invoice00'+self.id
elif len(str(self.id))==2:
return 'Invoice0'+self.id
else:
return 'Invoice'+self.id
def __str__(self):
return f'{self.seller} {self.buyer} {self.date}'
class Item(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE)
price = models.DecimalField(decimal_places=2, max_digits=20)
quantity = models.IntegerField(default=1)
tax = models.DecimalField(decimal_places=2, max_digits=4)
def total(self):
total = Decimal(str((self.price-self.tax)*self.quantity))
return total.quantize(Decimal('0.01'))
def __str__(self):
return f'{self.name} {self.quantity}'
Это serializers.py
from django.db.models import fields
from rest_framework import serializers
from rest_framework.fields import ReadOnlyField
from invoiceAPI.models import Seller, Buyer, Invoice, Item
class SellerSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
class Meta:
model = Seller
fields = '__all__'
class BuyerSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
class Meta:
model = Buyer
fields = '__all__'
class ItemSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
class Meta:
model = Item
fields = '__all__'
class InvoiceSerializer(serializers.ModelSerializer):
seller = SellerSerializer(many=False)
buyer = BuyerSerializer(many=False)
item = ItemSerializer(many=True)
class Meta:
model = Invoice
depth = 1
fields = ('seller', 'buyer', 'item', 'date')
def create(self, validated_data):
seller_data = validated_data.pop('seller')
buyer_data = validated_data.pop('buyer')
items_data = validated_data.pop('items')
print(seller_data, buyer_data, items_data)
seller = Seller.objects.create(**seller_data)
buyer = Buyer.objects.create(**buyer_data)
invoice = Invoice.objects.create(seller = seller, buyer = buyer, **validated_data)
items = []
for item_data in items_data:
Item.objects.create(invoice = invoice, **item_data)
return invoice
<
@api_view(['POST'])
def create_invoice(request):
print('inthe view')
invoice = InvoiceSerializer(data = request.data)
if invoice.is_valid():
invoice.save()
return Response({request.data})
и это view.py
данные для теста являются
{
"seller": {
"name": "Lalit Modi",
"phone": "9998887776",
"address": "New delhi"
},
"buyer": {
"name": "Yogi",
"phone": "9876543210",
"address": "Aligarh, Uttar pradesh"
},
"items": [{
"name": "Mobile",
"price": "30000",
"quantity": "10",
"tax": "5"
},
{
"name": "Laptop",
"price": "60000",
"quantity": "10",
"tax": "8"
},
{
"name": "Camera",
"price": "90000",
"quantity": "5",
"tax": "18"
}
]
}