【发布时间】:2018-07-26 21:57:33
【问题描述】:
我有两个模型:
class Author(models.Model):
name = models.CharField(max_length=100)
create_report = models.BooleanField(default=False)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.PROTECT)
title = models.CharField(max_length=100)
他们是这样在管理员中注册的:
class BookInline(admin.TabularInline):
model = PurchaseOrderItem
@admin.register(PurchaseOrder)
class AuthorAdmin(admin.ModelAdmin):
inlines = (PurchaseOrderInline,)
我通过 Django admin 创建了一个作者和两本书。在我点击“保存”按钮后,如果Author.create_report == True 我希望看到报告如下:
无论他是谁的作者都写过以下书籍:
第一本书的标题
第一本书的标题
(报告应该出现在哪里或如何呈现模板不是这里的相关问题,让我们跳过它们。)
我的第一个想法是覆盖Author.save() 方法:
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.create_report:
self.write_report(name=self.name, books=self.book_set.all())
问题是Author.save()方法在Book对象被保存之前执行,所以self.book_set.all()是空的。
一种解决方法是使用其他一些ModelAdmin 函数(例如log_addition()),它在Book 对象被保存后触发,但我也希望在管理员之外使用相同的功能,它是不是最好的解决方案。
在不使用管理层函数的情况下,我能以某种方式达到结果吗?
【问题讨论】:
-
不应该
author = models.ForeignKey(Seller, on_delete=models.PROTECT)是author = models.ForeignKey(Author, on_delete=models.PROTECT)? -
你是对的。感谢您指出。
标签: python django django-models