Сохранение экземпляра модели с использованием сигнала pre_save - PullRequest
0 голосов
/ 19 апреля 2019

Это мои модели:

class Stockdata(models.Model):
    user        = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_stock')
    company     = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
    stock_name  = models.CharField(max_length=32)

class Stock_journal(models.Model):
    user                = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True,related_name='user_closing')
    company             = models.ForeignKey(Company,on_delete=models.CASCADE,null=True,blank=True)
    stockitem           = models.OneToOneField(Stockdata,on_delete=models.CASCADE,null=True,blank=True,related_name='closingstock')
    closing_stock       = models.DecimalField(max_digits=10,decimal_places=2,null=True)

Это мой сигнал:

@receiver(post_save, sender=Stockdata)
def create_default_stock_ledger(sender, instance, created, **kwargs):
    if created:
        Stock_journal.objects.create(user=instance.User,company=instance.Company,stockitem=instance)

Я хочу передать сигнал pre_save, такой же, как я сделал в моем сигнале post_save, т.е. я хочу выполнить функцию сигнала pre_save вместо сигнала post_save ..

Когда я пытаюсь использовать сигнал pre_save, я получаю следующую ошибку:

save() prohibited to prevent data loss due to unsaved related object 'stockitem'.

Есть идеи, как это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

pre_save имеет различных аргументов , чем post_save. Когда вы используете created, вы на самом деле используете raw.

В тот момент, когда вы вызываете Stock_journal.objects.create, ваш экземпляр даже не сохраняется (т.е. существует в базе данных), поэтому вы не можете использовать instance при создании Stack_journal.

Подробнее о сырье из django docs:

сырье - Логическое значение; Истинно, если модель сохранена в точности, как представлено (т.е. при загрузке прибора). Не следует запрашивать / изменять другие записи в база данных как база данных может быть еще не в согласованном состоянии.

0 голосов
/ 19 апреля 2019

Вы присваиваете несохраненный объект stockitem (Stockdata) для OneToOneField, и поэтому возникает ошибка.

Когда вы присваиваете объект Stockitem (Stockdata) для OneToOneField, Id не генерируется, так как вы не сохранилиобъект stockitem и, следовательно, как говорит ошибка, приведет к потере данных при сохранении модели Stock_journal.

...