【问题标题】:django admin more than one ForeignKey for admin.TabularInlinedjango admin 为 admin.TabularInline 提供多个 ForeignKey
【发布时间】:2014-11-18 04:34:57
【问题描述】:

我正在尝试在管理部分实现一个带有子表单的表单。

form = Fighter()
subform = FighterFightHistory() //All of his fights

我的问题如下:

<class 'fighters.admin.Fights'>: (admin.E202) 'fighters.FighterFightHistory' has more than one ForeignKey to 'fighters.Fighter'.

那么如何让表单为每个外键(fighteropponent)显示一个下拉列表。

2 个外键是(见下文):

  • 战斗机的链接 (fighter)
  • 对手的链接 (opponent)

战士/models.py

class FighterFightHistory(TimeStampedModel):
    event = models.ForeignKey('events.Event', null=True)
    fight = models.ForeignKey('fights.Fight', null=True)
    fighter = models.ForeignKey(Fighter, related_name='%(app_label)s_%(class)s_fighter', null=True)
    howitended = models.ForeignKey('fights.HowItEnded', null=True)
    opponent = models.ForeignKey(Fighter, related_name='%(app_label)s_%(class)s_opponent', null=True)

    ended_in_round = models.IntegerField(blank=True, null=True)
    youtube_code = models.CharField(max_length=50, null=True, blank=True)
    win = models.NullBooleanField(blank=True, null=True)

战士/admin.py

class Fights(admin.TabularInline):
    model = FighterFightHistory
    extra = 30


class FighterAdmin(admin.ModelAdmin):

    list_display = ('name', 'history_completed', 'modified', 'active')
    search_fields = ['name']
    inlines = [Fights, ]

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这解决了我的问题(使用 fk_name):

    class Fights(admin.TabularInline):
        model = FighterFightHistory
        extra = 30
        fk_name = 'fighter'
    

    【讨论】:

    • 这也为我解决了同样的问题,不过,我很好奇为什么这会解决问题。通过添加fk_name,django 现在是否将fighter 视为主要FK 而opponent 以某种方式被不同地对待?与原帖类似,我需要有两个 FK 来建模,但我不想使用 m2m 字段。
    • 使用fk_name 对我来说也是ManyToManyField 的关键。
    【解决方案2】:

    我的第一个想法是,您可以使用 ManyToMany-Fields,然后将关系数限制为两个。但后来我想,你永远无法确定哪个 Fighter-Object 代表哪种类型。

    然后我对 Django-Docs 进行了简短的查看,并找到了可以回答您问题的内容:Django-Doc

    有趣的是:

    Membership 对 Person 有两个外键(person 和invitationer),这使得关系模棱两可,Django 不知道该使用哪一个。在这种情况下,您必须使用 through_fields 明确指定 Django 应该使用哪些外键,如上例所示。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2012-06-29
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多