Как автоматически создавать объекты модели 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

Вернуться на верх