Django Декоратор @receiver обновляет объект ForeignKey при редактировании объекта - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 2 класса, которые являются автономными. Модель Trade рассчитывает множество статистических данных на основе объектов модели Entry, которые связаны с объектом Trade. Эта статистика рассчитывается только при сохранении торгового объекта.

Поэтому при обновлении объекта Entry вручную из-за изменений в процессе импорта. Мне также нужен этот объект Entry для отправки сигнала соответствующему объекту Trade (ForeignKey) для сохранения. В противном случае пользователю нужно будет найти этот объект Trade и нажать кнопку «Сохранить». Это было бы крайне неэффективно.

Вот мои текущие настройки и сообщение об ошибке. Это правильный способ решения этой проблемы или их проблемы с этим подходом / лучшими альтернативами?

models.py

class Trade(models.Model):
    ...
    @receiver(post_save, sender='portfolios.Entry')
    def update_trade_object(sender, **kwargs):
        trade = Trade.objects.get(pk=kwargs['instance'])
        trade.save()

class Entry(models.Model):
    ...
    trade = models.ForeignKey(Trade, on_delete=models.CASCADE, null=True, blank=True)
    

Текущая ошибка:

TypeError: Field 'id' expected a number but got <Entry: Entry object (605)>.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Здесь kwargs ['instance'] - это сохраненный экземпляр Entry. Если вы хотите получить экземпляр сделки, связанный с этим экземпляром входа, вы можете в основном сделать:

kwargs['instance'].trade

Подход, который у вас здесь, в порядке, вы определяете, когда запись сохраняется, и выполняете некоторые вычисления. . Другой подход может заключаться в отмене метода save модели Entry, но ваш подход хорош, и я так же поступаю в таких ситуациях.

Но я не понимаю, почему вы сохраняете сделку экземпляр, когда запись сохранена. Выполняете ли вы какие-то конкретные c расчеты по методу сохранения торговли или у вас есть другой приемник сигналов для торговли, чтобы выполнить упомянутые вами расчеты? Вместо эмуляции метода сохранения сделки при сохранении связанной записи вы можете вызвать метод для выполнения упомянутых вами вычислений непосредственно в методе приемника сигнала для сохранения записи, но это, конечно, зависит от того, как организован ваш код.

0 голосов
/ 04 августа 2020

Pk ожидает номер, а не весь объект.

Думаю, это должно быть: instance.pk или instance.id.

 @receiver(post_save, sender='portfolios.Entry')
 def update_trade_object(sender,instance, **kwargs):
    trade = Trade.objects.get(pk=instance.pk)
    trade.save()
...