【问题标题】:Django two self-referential foreign key [duplicate]Django的两个自引用外键[重复]
【发布时间】:2015-12-14 18:00:40
【问题描述】:

在 Django 1.7 中编写简单的应用程序。是表示链表元素的模型:

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='+')

【问题讨论】:

  • 我认为结束这个问题不是一个好主意,“重复”是一个废话(对这个问题几乎没有什么作用)。

标签: python django django-1.7


【解决方案1】:

您实际上可能会在一个领域完成您正在尝试的事情。我相信这会奏效:

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

注意'self'的使用;根据Django documentationTo create a recursive relationship – an object that has a many-to-one relationship with itself – use models.ForeignKey('self').

此外,我建议使用 OneToOneField 而不是 ForeignKey 尝试此操作,假设每个项目都只有一个前一个项目和一个下一个项目。

【讨论】:

  • 帮助使用:related_name='+'
猜你喜欢
  • 2013-02-23
  • 2020-06-04
  • 2011-12-04
  • 1970-01-01
  • 2014-06-04
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多