Если элементы не уникальны, вы можете использовать модель PlayerItem и определить ее как - модель , как предложил Даниэль Роузман. Чтобы не сохранять один и тот же элемент дважды, вы можете использовать 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
напрямую, чтобы получить доступ к дополнительным полям. (как задокументировано)