大家好,我刚开始使用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方法上执行此操作吗?或者我可以通过其他方式设置这些约束,以便模型相应地生成表单而无需手动执行。
对于角色的限制(通过游戏)是否可以在模型的定义上完成?
答案 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对象。
希望这会有所帮助......