2016-05-03 34 views
0

我有兩個模型,假設圖書和作者,如下:Django:如何修改共享相同外鍵的其他條目中的相同字段?

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 ... 我需要做這個過濾,所以我現在嘗試通過使用模型字段

+0

您是否嘗試過** Signal **或** DateTimeField **而不是BooleanField? – trantu

+0

作者在同一時間發佈兩本書時會發生什麼? – Sayse

+0

我是Django的新手,我從未使用** Signal **。 我已經爲published_date使用了** DateTimeField **,但是我想使用BooleanField作爲另一個標誌... – Gerald

回答

1

很簡單,你不存儲最新的書,你可以把它作爲作者的方法或屬性,可以做一個查詢以檢索它

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

將邏輯存儲到數據庫中是一個壞主意,它應該只存儲數據。

+0

是的,我在我的AuthorAdmin中使用這種方法,它工作正常。 因此,在AuthorAdmin中,我可以看到作者名單和他們每個人的latest_book。 現在我想要做的是在** BookAdmin **中添加一個標誌,指示該書是否爲latest_book,以及何時添加或刪除書籍以自動移動此標誌。 另外,我希望能夠過濾BookAdmin以僅查看標記爲latest_book的書籍。 難道我們可以使用list_filter方法得到結果嗎?如果是這樣,我可以用它作爲BookAdmin以及... – Gerald

+0

@Gerald - 你仍然可以在書上有一個(複雜的)方法 - self.author.book_set ... == self'但我不是確定你真的需要多少 – Sayse

+0

@Saryse - 你提出了一個邏輯測試,但我不確定要如何使用它?它仍然是在BookAdmin中定義latest_book標誌,對吧?如果是這樣,我發現如何做到這一點,但我不能使用list_filters來顯示只有這個標誌的書......因爲它不是一個元組的一部分。這就是爲什麼我正在尋找一種直接將標誌存儲爲元組的方式。我讀了一些關於save_related方法的東西......你認爲它會允許我改變共享相同外鍵(識別作者)的其他書籍的字段嗎? – Gerald

相關問題