我想模拟以下情况。我有一个项目表和一个玩家表,一个玩家可以有很多项目,并有同一项目的多个副本。我可以轻松地为具有多个项目的玩家建模:
class Item(models.Model):
name = models.CharField(max_length = 200, blank = False)
class Player(models.Model):
items = models.ManyToManyField(Term)
但我想知道玩家拥有的每件物品的数量,即每个物品的频率。我怎样才能在Django中最好地模拟这个。 (我已经简化了我的实际模型/问题以获得我的观点:))
干杯,
皮特
答案 0 :(得分:5)
将explicit through
table与quantity
字段一起使用。
答案 1 :(得分:0)
如果这些项目是非唯一的,您可以使用PlayerItem模型并将其定义为through model,如Daniel Roseman所建议的那样。为避免将同一项目保存两次,您可以使用unique_together
:
class Item(models.Model):
name = models.CharField(max_length = 200, blank = False)
class Player(models.Model):
items = models.ManyToManyField(Item, through='PlayerItem')
class PlayerItem(models.Model):
player = models.ForeignKey(Player)
item = models.ForeignKey(Item)
quantity = models.IntegerField(default=1)
class Meta:
unique_together = ('player', 'item')
但是,如果项目略有不同或者您需要存储采集日期,则需要进行不同的设置:
class Item(models.Model):
name = models.CharField(max_length = 200, blank = False)
class Player(models.Model):
items = models.ManyToManyField(Item, through='PlayerItem')
class PlayerItem(models.Model):
player = models.ForeignKey(Player)
item = models.ForeignKey(Item)
acquired = models.DateTimeField(default=datetime.datetime.now)
这次你将保存(玩家,项目)元组的重复项,每个项目一个。然后,您可以通过count()
获取特定项目的编号。
我还要注意,您无法从PlayerItem
和Item
获得Player
模型。在这两种情况下,您都需要直接查询PlayerItem
以访问额外字段。 (记录在案)