Raise TypeError( TypeError: Прямое присвоение прямой стороне множества "многие ко многим" запрещено. Вместо этого используйте order_item.set()
Когда я пытаюсь сделать сериализатор для своей модели для сохранения элементов заказа, я получаю эту ошибку
- This is my serializer
class OrdersItemsSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItems
fields = ["customer","product","quantity"]
class OrdersSerializer(serializers.ModelSerializer):
order_item = OrdersItemsSerializer(many = True)
class Meta:
model = Orders
fields = ["id","order_at","customer","total_price","diliver_at","order_item"]
def save(self):
order_item = self.validated_data.pop('order_item')
orderitemsls=set()
for f in order_item:
orderitems=OrderItems(
customer=f['customer'],
product=f['product'],
quantity=f['quantity'],
)
orderitems.save()
print(orderitems.id)
orderitemsls.add(orderitems)
print(orderitemsls)
new_order=Orders(
customer=self.validated_data['customer'],
total_price=self.validated_data['total_price'],
order_item=orderitemsls
)
return orderitemsls
- This is my models
from django.db import models
from django.contrib.auth import get_user_model
# Create your models here.
User = get_user_model()
class Customers(models.Model):
customer = models.OneToOneField(User, on_delete=models.CASCADE)
profile_picture = models.ImageField()
phone=models.CharField(max_length=12)
address=models.CharField(max_length=500)
reg_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = "Customers"
unique_together = ('customer', 'id')
def __str__(self):
return self.customer.username
class Categories(models.Model):
name = models.CharField(max_length=100)
image = models.ImageField()
reg_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.name
class Vendors(models.Model):
vendor = models.OneToOneField(User, on_delete=models.CASCADE)
profile_picture = models.ImageField()
phone=models.CharField(max_length=12)
address=models.CharField(max_length=500)
reg_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = "Vendors"
def __str__(self):
return self.vendor.username
class Products(models.Model):
name = models.CharField(max_length=100)
image = models.ImageField()
price=models.IntegerField()
vendor = models.ForeignKey(Vendors, on_delete=models.CASCADE)
reg_at = models.DateTimeField(auto_now_add=True)
category = models.ForeignKey(Categories, on_delete=models.CASCADE)
class Meta:
verbose_name_plural = "Products"
def __str__(self):
return self.name
class OrderItems(models.Model) :
customer = models.ForeignKey(Customers, on_delete=models.CASCADE)
ordered = models.BooleanField(default=False)
product = models.ForeignKey(Products, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
class Meta:
verbose_name_plural = "OrderItems"
def __str__(self):
return f"{self.quantity} of {self.product.name}"
class Orders(models.Model):
order_item = models.ManyToManyField(OrderItems)
order_at = models.DateTimeField(auto_now_add=True)
customer = models.ForeignKey(Customers, on_delete=models.CASCADE)
total_price=models.CharField(max_length=100,blank=True)
diliver_at = models.DateTimeField(blank=True)
ordered = models.BooleanField(default=False)
class Meta:
verbose_name_plural = "Orders"
def __str__(self):
return str(self.id)
- This is my views
class api_order(APIView):
def post(self, request,id=None, format=None):
serializer=OrdersSerializer(data=request.data)
data={}
if serializer.is_valid():
serializer.save()
data["success"]="Order Added"
# return Response(data=data)
else:
data=serializer.errors
return Response(data)
- data that { "customer": 3, "total_price": "2557", "diliver_at": "2021-12-14T14:49:50.492950Z", "order_item": [ { "customer": 3, "product": 2, "quantity": 3 }, { "customer": 3, "product": 3, "quantity": 2 } ] }