2017-03-03 61 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我編輯了答案。我希望現在更清楚。 –