проблема с пользовательским методом сохранения django с вновь созданным идентификатором объекта

#django #django-models

#django #django-модели

Вопрос:

Ниже приведен один из моих методов сохранения в модели.

Я пытаюсь использовать вновь созданный идентификатор при сохранении объекта для заполнения другого поля, как показано в строке 73. Это работает не очень хорошо, по-видимому, потому, что объект еще не создан.

Каков наилучший способ сделать то, чего я пытаюсь достичь? Куда я должен переместить супер-метод?

  64     def save(self, *args, **kwargs):
 65         '''
 66         Save invoice and receipt number
 67         '''
 68         
 69         if self.status == 'pending' and self.invoice is None:
 71             invoice = "%s-Inv-%s-%s" % (self.event.event_acronym,
 72                                         date.today().strftime('%y%m%d'),
 73                                         self.id)
 74             self.invoice = invoice
 75             super(Order, self).save(*args, **kwargs)
 76 
 77         if self.status == 'completed' and self.receipt is None:
 78             total_success = Order.objects.all.filter(status='completed').count()
 79             if not total_success:
 80                 receipt = "%s-R-%s-%s" % (self.event.acronym,
 81                                           date.today().strftime('%y%m%d'),
 82                                           1)
 83             else:
 84                 receipt = "%s-R-%s-%s" % (self.event.event_acronym,
 85                                           date.today().strftime('%y%m%d'),
 86                                           total_success   1)
 87             self.receipt = receipt
 88             self.receipt_date = datetime.datetime.now
 89             super(Order, self).save(*args, **kwargs)
  

Ответ №1:

если вы хотите получить доступ к сохраненному объекту, вам нужно сначала запустить super().save(), например, переместить строку 75 в приведенном выше до строки 71

хотя, возможно, стоит сделать шаг назад и подумать о том, чего вы на самом деле пытаетесь достичь. как отмечалось выше, сигналы могут быть вашим другом здесь

Ответ №2:

Я предлагаю вам использовать сигналы вместо перезаписи метода сохранения в объекте:

https://docs.djangoproject.com/en/1.3/ref/signals/#django.db.models.signals.post_save

Если вы вызываете метод save в методе save, строка 75, у вас могут возникнуть проблемы с повторением, возможно, вам нужно выяснить, какой код выполняется в сигнале pre_save (у объекта her3 может не быть идентификатора) и что в post_save (здесь всегда есть идентификатор)

Ответ №3:

Ваша проблема в том, что у self нет идентификатора до тех пор, пока он не будет сохранен ORM.

 if not self.id:
   # is True the first time an object is saved
  

Сигнал позволит вам запустить функцию после сохранения объекта, поэтому у него будет свой идентификатор, и вы сможете заниматься своими делами.