【问题标题】:Django: How to modify the same field in other entries sharing the same Foreign Key?Django:如何修改共享相同外键的其他条目中的相同字段?
【发布时间】:2016-08-28 04:37:12
【问题描述】:

我有两个模型,比如说书和作者,如下:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey('Author')
    latest_book = models.BooleanField(default=True)

现在,当我创建链接到作者的新书时,“latest_book”字段将自动设置为 True,到目前为止还不错...

例如,假设我有一个三部曲的作者:Book1、Book2 和 Book3 - Book3 是最新的。

我有两个问题: 1 - 保存Book3时如何将Book1和Book2的“latest_book”字段设置为false? 2 - 如果Book3正在被删除,如何将Book2的“latest_book”字段设置为true?

我以前也使用过一种方法,但问题是我无法使用 BookAdmin 中的 list_filter 来仅显示所有作者的最新书籍,因为我从未找到如何在方法结果上使用 list_filter... 我需要做这个过滤,所以我现在尝试使用模型字段

【问题讨论】:

  • 您是否尝试过 SignalDateTimeField 而不是 BooleanField ?
  • 作者同时发行两本书会怎样?
  • 我是 Django 新手,从未使用过 Signal。我已经使用 DateTimeField 作为发布日期,但我还想使用 BooleanField 作为标志...
  • 只有一本书是最新的,所以即使同一天出两本书,我也可以另外调整时间,这很好。我希望每位作者只看到一本 latest_book。

标签: python django


【解决方案1】:

很简单,你不存储最新的书,你可以将它作为作者的方法或属性,可以通过查询来检索它

def latest_book(self):
    return self.book_set.order_by('published_date').first()

将逻辑存储到数据库中是个坏主意,它应该只存储数据。

【讨论】:

  • 是的,我在我的 AuthorAdmin 中使用了这个方法,它工作正常。所以在 AuthorAdmin 中,我可以看到作者列表,以及他们每个人的最新书。我现在想做的是在 BookAdmin 中有一个标志,指示这本书是否是最新的书,当我添加或删除一本书时,自动移动这个标志。此外,我希望能够过滤 BookAdmin 以仅查看标记为 latest_book 的书籍。我们有什么办法可以列出过滤方法的结果吗?如果是这样,我也可以将它用于 BookAdmin...
  • @Gerald - 你仍然可以在书中使用(复杂的)方法 - self.author.book_set... == self 但我不确定你到底需要多少
  • @Saryse - 您建议进行逻辑测试,但我不确定应该如何使用它?仍然是在 BookAdmin 中定义 latest_book 标志,对吧?如果是这样,我发现了怎么做,但是我不能使用 list_filters 只显示带有这个标志的书......因为它不是元组的一部分。这就是为什么我一直在寻找一种将标志直接存储为元组的方法。我读了一些关于 save_related 方法的东西......你认为它会允许我改变共享相同外键(识别作者)的其他书籍的字段吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多