Как автоматически создавать объекты модели Django при создании других объектов модели
Я хочу создать объект для модели "ProductOut", когда создается модель "CusOrder"
Вот мой код
class CusOrder(models.Model):
cus_name = models.CharField(max_length=100)
cus_number = models.CharField(max_length=11)
product = models.ManyToManyField(Product)
qty = models.IntegerField(default=0)
sell_price = models.IntegerField(default=0)
def __str__(self):
return self.cus_name
def save(self,*args,**kwrgs):
ProductOut.objects.create(
refrence=self.cus_number,
stock_out = self.qty,
sell_price = self.sell_price,
product = self.product.P_name
)
super(CusOrder,self).save(*args,**kwrgs)
class ProductOut(models.Model):
refrence = models.ManyToManyField(CusOrder)
stock_out = models.IntegerField(default=0)
sell_price = models.IntegerField(default=0)
product = models.ForeignKey(Product,on_delete=models.CASCADE)
def __str__(self):
return self.refrence.cus_number
Но я получаю ошибку ValueError, которая заключается в том, что "<CusOrder: Asif>" должно иметь значение для поля "id", прежде чем это отношение "многие-ко-многим" может быть использовано. Когда я хочу сохранить объект CusOrder Object
Здесь мое целое
class Catagory(models.Model):
name = models.CharField(max_length=60)
def __str__(self):
return self.name
class Product(models.Model):
P_name = models.CharField(max_length=30)
stock_in = models.IntegerField(default=0)
unit_price = models.IntegerField(default=0)
cata = models.ForeignKey(Catagory, on_delete=models.CASCADE)
def __str__(self):
return self.P_name
class CusOrder(models.Model):
cus_name = models.CharField(max_length=100)
cus_number = models.CharField(max_length=11)
product = models.ManyToManyField(Product)
qty = models.IntegerField(default=0)
sell_price = models.IntegerField(default=0)
def __str__(self):
return self.cus_name
def save(self,*args,**kwrgs):
ProductOut.objects.create(
refrence=self.cus_number,
stock_out = self.qty,
sell_price = self.sell_price,
product = self.product.P_name
)
super(CusOrder,self).save(*args,**kwrgs)
class ProductOut(models.Model):
refrence = models.ManyToManyField(CusOrder)
stock_out = models.IntegerField(default=0)
sell_price = models.IntegerField(default=0)
product = models.ForeignKey(Product,on_delete=models.CASCADE)
def __str__(self):
return self.refrence.cus_number
class ReturnedProduct(models.Model):
cus_number = models.ForeignKey(CusOrder,on_delete=models.CASCADE)
product = models.ForeignKey(Product,on_delete=models.CASCADE)
qty = models.IntegerField(default=0)
def __str__(self):
return self.cus_number.cus_number
Что будет правильной процедурой для этого.
refrence
должен иметь экземпляр CusOrder и super должен вызываться до создания, так как объект CusOrder должен быть создан первым.
def save(self,*args,**kwrgs):
instance = super(CusOrder,self).save(*args,**kwrgs)
p_instance = ProductOut.objects.create(
stock_out = self.qty,
sell_price = self.sell_price,
product = self.product.P_name
)
p_instance.refrence.add(instance)
p_instance.save()
Лучший способ - использовать Django Signals, В приведенном выше случае конкретно используется post_save. Сигналы Django - мастер pre_save и post_save