2017-03-03 60 views
1

循环引用这是我的模型看起来像: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_statesGameStates一个many-to-many循环引用。该字段包含以下信息:给定用户所处的当前状态,允许其他状态。

我尝试如下的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

如果您从Model1创建ManyToManyField到Model2,则通过表将具有一个ForeignKey到Model1和一个ForeignKey到Model2。

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

如果通过表格生成“GameStates.allowed_states.through”,它将不具有ForeignKey字段的相关名称。

我想你需要通过writing another class定义表,并在模型ForeignKeys来通过表格

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

相应指定related_name你可以在管理

+0

维纳亚克嗨注册AllowedStates,能否请您详细说明进一步根据你的意思创建另一个班级?你能分享一些可以帮助我开始的示例代码吗?谢谢。 –

+0

@TheWanderer我编辑了答案。我希望现在更清楚。 –