[英]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
類作為模型沒有意義。 這是因為那里沒有定義模型字段。 如果要使用此模型存儲數據,則必須定義作為字段類實例的屬性。
因此,您可能需要重命名“ Moves
到Move
(因為它表示單個移動),並按以下方式重新定義它:
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()
您應該在游戲實例之前的測試中創建Moves實例,並在調用其方法之前將其鏈接到游戲:
class MakeMoveTestCase(TestCase):
def test_make_move(self):
moves = Moves()
game = Game(moves=moves)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.