为我的模型创建此字段的最佳方法

时间:2011-01-22 18:13:44

标签: django django-models

大家好,我刚开始使用django,并想知道如何在我的模型中执行以下行为:

class Game(models.Model)
  characters_count = models.IntegerField(default=1) #basically i set to a choice of 1-3

class Match(models.Model)
 video=models.ForeignKey(Game)
 p1char1 = models.ForeignKey(Character)
 p2char1 = models.ForeignKey(Character)
 p1char2 = models.ForeignKey(Character)
 p2char2 = models.ForeignKey(Character)
 p1char3 = models.ForeignKey(Character)
 p2char3 = models.ForeignKey(Character)

视频包含Match所依赖的实例游戏。

我需要创建一个约束,选择的角色来自给定的游戏,并且每个玩家选择的角色数量也受游戏限制。

我应该在Save方法上执行此操作吗?或者我可以通过其他方式设置这些约束,以便模型相应地生成表单而无需手动执行。

对于角色的限制(通过游戏)是否可以在模型的定义上完成?

1 个答案:

答案 0 :(得分:0)

对于你的角色,你应该与角色模型建立多对多的关系。

然后重写Match save()方法以约束所选字符数。

另一种方法是将此约束放在基于匹配的模型的clean()方法中:因此它们有一个可供选择的列表(使用复选框列表小部件),如果它们选择了太多字符,则表单将将您放入clean()

的错误消息进行重新连接

要根据游戏限制角色,您可以在角色和游戏之间添加另一个M2M关系('allowed_in_game'):在管理员中,您将能够从游戏中选择角色。

然后,在Match Modelform中,您必须修改ModelchoiceField,显示字符以过滤它们,以便仅显示与当前游戏相关的字符。

以下是(仅borrowed from here):

class Matchform(forms.ModelForm):
    class Meta:
        model = Match

     def __init__(self, game, *args, **kwargs):
         super(Matchform, self).__init__(*args, **kwargs)
         self.fields['character'].queryset = Character.objects.filter(allowed_in_game__in = game)

然后你可以这样调用你修改过的ModelForm:

Matchform(game)
Matchform(game,request.POST)
Matchform(game,instance=m)

您可以看到,每次添加“game”参数时,它都应该是此示例的Game对象。

希望这会有所帮助......