#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
Сигнал позволит вам запустить функцию после сохранения объекта, поэтому у него будет свой идентификатор, и вы сможете заниматься своими делами.