簡體   English   中英

為我的Django模型設計?

[英]Design for my models in Django?

我有一個使用外鍵Move的Game模型,如下所示:

class Moves(models.Model):
   player1 = []
   player2 = []

   def make_move(self, a_int, b_int, c_bool):        
    if c_bool:
        self.player1.append(a_int)
    else:
        self.player2.append(b_int)

   #...irrelevant functions

class Game(models.Model):
   #...irrelevant variables
   moves = models.ForeignKey(Moves)

因此,我希望每個游戲都有一組獨特的Moves。 移動存儲在玩家1和玩家2的列表中。

所以在測試中,我做了這樣的事情...

class MakeMoveTestCase(TestCase):    
    def test_make_move(self):
        g = Game()
        g.moves.make_move(3, 0, False) #####throws error here
        g.moves.make_move(4, 0, False)

並得到這個錯誤:

TypeError:int()參數必須是字符串或數字,而不是“列表”

我需要擺脫該錯誤的幫助。 另外,如果您有更好的設計,我希望看到它。

除了向您展示如何消除此錯誤外,我將嘗試解釋您的設計出了什么問題。

首先,您定義的Moves類作為模型沒有意義。 這是因為那里沒有定義模型字段。 如果要使用此模型存儲數據,則必須定義作為字段類實例的屬性。

因此,您可能需要重命名“ MovesMove (因為它表示單個移動),並按以下方式重新定義它:

from django.db import models
from django.utils.translation import ugettext as _

class Move(models.Model):
    PLAYER_1, PLAYER_2 = 1, 2
    PLAYERS = (
        (PLAYER_1, _('Player 1')),
        (PLAYER_2, _('Player 2'))
    )

    game = models.ForeignKey(Game, related_name='moves')
    player = models.IntegerField(choices=PLAYERS)
    x = models.IntegerField()
    y = models.IntegerField()

現在,如果您要創建游戲和移動並將其添加到游戲中,則可以編寫如下內容:

game = Game.objects.create(...)
move = Move.objects.create(game=game, x=1, y=5, player=Move.PLAYER_2)

如果要在Django中實現,並且希望保持良好的模型-視圖-模板區別,則應考慮對Moves模型進行更改。 模型僅應表示數據,因此make_move移至視圖或其他支持類。 Moves模型中的玩家似乎也應該是一個單獨的類,因為一個玩家理論上可以在多個游戲中進行移動,等等。換句話說,使玩家與移動脫鈎。

另外,我同意@piotrekw的觀點,即Moves應該變成Move並且只能代表一個動作。 每個動作都應鏈接到作為外鍵字段的Player ,以及它所屬的Game

class Player(models.Model):
  pass

class Game(models.Model):
  player1 = models.ForeignKeyField(Player._id)

class Move(models.Model):
  game = models.ForeignKeyField(Game._id)
  player = models.ForeignKeyField(Player._id)
  a_int = models.IntegerField()
  b_int = models.IntegerField()

從這里開始,實際上添加Move應該遵循標准Django慣例,您可以在此處的教程中找到

您應該在游戲實例之前的測試中創建Moves實例,並在調用其方法之前將其鏈接到游戲:

class MakeMoveTestCase(TestCase):    
    def test_make_move(self):
        moves = Moves()
        game = Game(moves=moves)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM