首页 > 解决方案 > 如何修复“多个外键”Django

问题描述

我是 Django 新手(使用版本:2.1.5)(Python 3.6)并试图弄乱一些模型。我正在建立一个国际象棋数据库。这依赖于 3 个模型,玩家、游戏和构成游戏的动作。每场比赛都有一名白人球员和一名黑人球员,他们都是职业球员。这会引发错误:

<'class 'chessengine.admin.GameInline'>: (admin.E202) 'chessengine.Game' has more than one ForeignKey to 'chessengine.Player'.

我尝试使用参考名称删除了较早的相关错误,但不会处理上述错误。


//models.py


class Player(models.Model):

    name = models.CharField(max_length=200)
    birth_date = models.DateField('birthday')

    def game_count(self):
        return Player.objects.filter(Games__white_player=self.name).count() + Player.objects.filter(Games__black_player=self.name).count()


class Game(models.Model):

    number = models.IntegerField()
    date = models.DateField('date played')
    moves = models.IntegerField()
    white_player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='white_player')
    black_player = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='black_player')
    result = models.CharField(max_length=8)

//admin.py

class GameInline(admin.TabularInline):

    inlines = [MoveInline]
    model = Game


class PlayerAdmin(admin.ModelAdmin):

    fieldsets = [
        ('Player Information',               {'fields': ['name', 'birth_date']}),
        ('Game Information', {'fields': ['date', 'player_white', 'player_black', 'result'], 'classes': ['collapse']}),
    ]
    inlines = [GameInline]
    list_display = ('name', 'birth_date', 'game_count')
    list_filter = ['name']

标签: pythondjangodjango-modelsdjango-admin

解决方案


由于Game model有多个 ForeignKey 到Player model. 所以在定义时TabularInline for Game ie. GameInline你必须fk_name添加GameInline

class GameInline(admin.TabularInline):
    inlines = [MoveInline]
    model = Game
    fk_name = 'white_player`

在此处阅读有关 fk_name的更多信息


推荐阅读