django在Admin上注册具有多对多循环引用的模型

时间:2017-03-03 02:13:17

标签: django

这就是我的模型的样子:

class GameStates(models.Model):
    state_code = models.CharField(max_length=20)
    state_name = models.CharField(max_length=100)
    order = models.IntegerField()
    allowed_states = models.ManyToManyField('GameStates', related_name='allowed_states_admin')

    def __str__(self):
        return self.state_code

allowed_states有一个many-to-many循环引用GameStates。该字段包含以下信息:给定用户所处的当前状态,允许他进入的其他状态是什么。

我正在尝试在Admin上注册此模型,如下所示:

class GameStatesInline(admin.TabularInline):
    model = GameStates.allowed_states.through


@admin.register(GameStates)
class GameStatesAdmin(admin.ModelAdmin):
    inlines = [GameStatesInline]
    exclude = ('allowed_states',)

但是,我不断收到以下错误消息:
GameStates_allowed_states' has more than one ForeignKey to 'GameStates'.

非常感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

如果从Model1到Model2创建ManyToManyField,则through表将有一个到Model1的ForeignKey和一个到Model2的ForeignKey。

由于您正在从GameStates到GameStates创建ManyToManyField,因此直通表将有2个ForeignKeys到GameStates。除非这些ForeignKey关系具有'related_name',否则无法准备此模型类。

如果您使用“GameStates.allowed_states.through”通过表生成,则它将没有ForeignKey字段的相关名称。

我认为您需要通过writing another class通过表定义并在与通过表对应的模型的ForeignKeys中指定related_name

class AllowedStates(models.Model):
    game_state = models.ForeignKey('GameState', related_name='something')
    allowed_state = models.ForeignKey('GameState', related_name='something_else')

您可以在Admin

中注册AllowedStates