2015-06-03 75 views
0

我有一個Order模型。我想跟蹤每個訂單的當前狀態以及它經歷的狀態。在Django中互相引用的兩個外鍵

我可以使用

class Order(models.Model): 
    current_state = models.ForeignKey('State') 

class State(models.Model): 
    order = models.ForeignKey(Order) 

或者是它更好地使用

class Order(models.Model): 
    pass 

class State(models.Model): 
    order = models.ForeignKey(Order) 
    is_current = models.BooleanField(default=True) 

我不知道這是否是不好的做法,有兩個外鍵引用對方。

回答

0

這些不是「引用對方的兩個外鍵」 - 這不代表什麼意思,而是「兩個引用對方的模型」。

這裏沒有「更好」的解決方案,取決於您的確切規格和需求,但作爲一般規則,您的模型越簡單越好。如果「當前」狀態保證始終是最後一個狀態(您可能希望在State型號FWIW中擁有created_on時間戳),則不需要Order.current_state FK,甚至不需要is_current標誌。

此外,如果你去的Order.current_state FK,你必須讓它空的,否則你將有一個雞和蛋的問題...

哦,是的:這是definitly不是Django或Python的問題,它是一個關係模型設計問題。

+0

我喜歡從最後創建的狀態對象獲取當前狀態的想法。但是如果我想按他們的狀態過濾所有的訂單呢?我可以在我的訂單模型中創建一個函數def get_current_state():return self.states.latest()'但我不知道如何在查詢集中使用它,當它不是數據庫中的字段時。我不能'Order.objects.filter(get_current_state__type = 1)' – Jamgreen