2015-09-17 45 views
2

在Django 1.7中編寫一個簡單的應用程序。是代表一個鏈表的元素的模型:Django兩個自引用外鍵

class TrainingUserWordSetItem(models.Model): 
    training_set = models.ForeignKey(TrainingUserWordSet) 
    user_word = models.ForeignKey(UserWord) 
    prev_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None) 
    next_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None) 

遷移時我得到一個錯誤:

hellodict.TrainingUserWordSetItem.next_item: (fields.E304) Reverse accessor for 'TrainingUserWordSetItem.next_item' clashes with reverse accessor for 'TrainingUserWordSetItem.prev_item'. 
     HINT: Add or change a related_name argument to the definition for 'TrainingUserWordSetItem.next_item' or 'TrainingUserWordSetItem.prev_item'. 
hellodict.TrainingUserWordSetItem.prev_item: (fields.E304) Reverse accessor for 'TrainingUserWordSetItem.prev_item' clashes with reverse accessor for 'TrainingUserWordSetItem.next_item'. 
     HINT: Add or change a related_name argument to the definition for 'TrainingUserWordSetItem.prev_item' or 'TrainingUserWordSetItem.next_item'. 

如何使兩個自引用外鍵字段?

更新:

的幫助下使用related_name = '+':

class TrainingUserWordSetItem(models.Model): 
    training_set = models.ForeignKey(TrainingUserWordSet) 
    user_word = models.ForeignKey(UserWord) 
    prev_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None) 
    next_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None, related_name='+') 
+0

我不認爲這是一個好主意,關閉這個問題,「重複」是一個廢話(並且對這個問題有很少做)。 – peterh

回答

5

其實你可以或許完成你有一個字段嘗試什麼。我相信這會起作用:

next_item = models.ForeignKey('self', null=True, default=None, related_name='prev_item') 

請注意使用'self';根據Django documentation,To create a recursive relationship – an object that has a many-to-one relationship with itself – use models.ForeignKey('self').

此外,我會建議嘗試與OneToOneField,而不是一個ForeignKey,假設每個項目將只有一個前一個和下一個項目。

+0

幫助使用:related_name ='+' –