【问题标题】:Django Designing Model : Item/Inventory/UserDjango 设计模型:项目/库存/用户
【发布时间】:2018-12-11 00:47:15
【问题描述】:

我想就特定模型行为建模提出一些建议。 基本上我有一个模型项目。它描述了项目的名称和描述。

我有一个库存,它应该包含一个项目“列表”,考虑到每个项目的数量应该在库存中指定。

每个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):
?

我不确定这是否是正确的方法。

【问题讨论】:

    标签: python django api models


    【解决方案1】:

    您应该使用多对多关系。首先,您应该从 User 模型中删除 FK。然后为项目创建一个单独的模型,最后将许多用户链接到许多项目(一个用户可以处理多个项目,一个项目可以属于多个用户)。类似的东西:

    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

    【讨论】:

    • 谢谢,这正是我们想要的。我知道这个类命名约定,我只是输入了这个问题,我没有注意到。
    • 您的模型将允许User 拥有多个Inventory,将用户ForeignKey 更改为OneToOneField。我还将 Meta 选项 unique_together 添加到 useritem 字段,这样您就不会最终将重复的项目添加到用户的库存中。
    【解决方案2】:
    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)
    

    我认为这将是一个更好的设计。

    【讨论】:

    • 我们如何保证单个库存,这看起来像是用户和物品对的集合?也许我们应该重写save 方法。
    【解决方案3】:
    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)
    

    这应该按照您的规范工作。我们已将库存绑定到用户,并且每个项目都有一个指向 Inventory 表的外键。

    现在你可以做

    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. 
    

    【讨论】:

      猜你喜欢
      • 2015-01-28
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多