Джанго - Как правильно смоделировать это? - PullRequest
1 голос
/ 21 января 2010

Я хочу смоделировать следующую ситуацию. У меня есть таблица предметов и таблица игроков, и игрок может иметь много предметов и иметь несколько копий одного и того же предмета. Я могу легко смоделировать игрока с несколькими предметами:

class Item(models.Model):
    name = models.CharField(max_length = 200, blank = False)

class Player(models.Model):
    items = models.ManyToManyField(Term)

Но я хочу знать номер каждого предмета, который есть у игрока, т.е. частоту каждого предмета. Как я могу лучше всего моделировать это в Джанго. (Я упростил мои фактические модели / проблемы, чтобы получить свою точку зрения :))

Приветствия

Пит

Ответы [ 2 ]

5 голосов
/ 21 января 2010

Используйте явную through таблицу с полем quantity.

0 голосов
/ 21 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...