Обновление : читая непосредственно исходный код django, я получил один недокументированный недостающий фрагмент, чтобы решить мою проблему. Благодаря Брэндону, который решил половину проблемы, предоставив мне одну из недостающих частей. Смотрите мой собственный ответ, чтобы увидеть мое решение (я не хочу смешивать вещи здесь).
У меня есть следующие (упрощенные) модели:
Order(models.Model):
status = models.CharField( max_length=25, choices=STATUS_CHOICES, default='PENDING')
total = models.DecimalField( max_digits=22, decimal_places=2)
def clean(self):
if self.estatus == 'PAID' or self.estatus == 'SENT':
if len(self.payment.all()) > 0:
raise ValidationError("The status cannot be SENT or PAID if there is no payment for the order")
Payment(models.Model):
amount = models.DecimalField( max_digits=22, decimal_places=2 )
order = models.ForeignKey(Order, related_name="payment")
def clean(self):
if self.amount < self.order.total or self.amount <= 0:
ValidationError("The payment cannot be less than the order total")
В моем admin.py у меня есть:
class paymentInline(admin.StackedInline):
model = Payment
max_num = 1
class OrderAdmin(admin.ModelAdmin):
model = Order
inlines = [ paymentInline, ]
Проверка в чистом методе Заказа не работает, поскольку при проверке платеж не сохранен (очевидно, он не был сохранен в базе данных).
Проверка внутри платежа работает нормально (при редактировании или добавлении нового платежа).
Я хочу проверить, есть ли в заказе платеж, если статус «Оплачен» или «Отправлен», но, поскольку я не могу этого сделать, используется чистый метод.
У меня вопрос, как я могу получить доступ к значению payment.amount, введенному пользователем во встроенную (платежную) форму заказа, чтобы выполнить мою проверку? (учитывая im в чистом методе модели Order)