Django Designing Model: Предмет / Инвентарь / Пользователь - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы спросить несколько советов по моделированию поведения конкретной модели. В основном у меня есть модель Item. Он описывает название и описание предмета.

У меня есть инвентарь, в котором должен быть «Список» предметов, учитывая, что количество каждого предмета должно быть указано в инвентаре.

Каждый User должен иметь один уникальный инвентарь.

Вот что я пытаюсь сделать:

class User(models.Model):
    name = models.CharField(max_length=100)
    invetory =models.ForeignKey(inventory,on_delete=models.CASCADE)


class item(models.Model):
    name =models.CharField(max_length=40)
    description = models.TextField(max_length=200)
    value = models.FloatField()

class inventory(models.Model):
?

Я не уверен, что это правильный подход.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018
class inventory(models.Model):
    user = models.ForeignKey(User, default=User.objects.first())
    item = models.ForeignKey(Item, default=Item.objects.first())
    count = models.IntegerField(default=0)

Я думаю, это улучшит дизайн.

0 голосов
/ 02 июля 2018

Вы должны использовать отношения «многие ко многим». Прежде всего вы должны удалить FK из модели User. Затем создайте отдельную модель для элементов и, наконец, свяжите множество пользователей со многими элементами (один пользователь может обрабатывать несколько элементов, а один элемент может принадлежать нескольким пользователям). Примерно так:

class User(models.Model):
    name = models.CharField(max_length=100)


class item(models.Model):
    name =models.CharField(max_length=40)


class inventory(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    item = models.ForeignKey(item, on_delete=models.DO_NOTHING)
    quantity = models.FloatField()

PS Имена классов должны использовать соглашение PascalCase https://www.python.org/dev/peps/pep-0008/?#class-names

0 голосов
/ 02 июля 2018
class User(models.Model):
    name = models.CharField(max_length=100)


class Inventory(models.Model):
   user = models.OneToOneField(User,on_delete=models.CASCADE)

class Item(models.Model):
    name =models.CharField(max_length=40)
    description = models.TextField(max_length=200)
    value = models.FloatField()
    invetory =models.ForeignKey(Inventory,on_delete=models.CASCADE)

Это должно работать согласно вашей спецификации. Мы привязали инвентарь к пользователю, и у каждого предмета будет внешний ключ к таблице инвентаря.

Теперь вы можете сделать

1. To access inventory you can do `user.inventory`
2. To get a list of items `user.inventory.item_set` 
3. You should use the `post_save` signal to create the inventory object. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...