Django:具有不同字段的模型(实体-属性-值模型)

b3rt0

我有以下Django模型将稀疏产品数据存储在关系数据库中。对于以下代码中的任何错误关系,我深表歉意(ForeignKey和/或ManyToMany可能放置错误,我现在只是在玩Django)。

class ProdCategory(models.Model):
    category = models.CharField(max_length=32, primary_key=True)

class ProdFields(models.Model):
    categoryid = models.ForeignKey(ProdCategory)
    field = models.CharField(max_length=32)

class Product(models.Model):
    name = models.CharField(max_length=20)
    stock = models.IntegerField()
    price = models.FloatField()

class ProdData(models.Model):
    prodid = models.ManyToManyField(Product)
    fieldid = models.ManyToManyField(ProdFields)
    value = models.CharField(max_length=128)

这个想法是将每个产品名称库存价格存储在一个表中,而每个产品的信息以(idvalue)格式存储在另一个表中。

我确实知道每个产品类别应具有的字段。例如,Desktop类型的产品应将内存大小存储大小作为字段,而Monitor类的另一产品应将分辨率屏幕大小作为字段。

我的问题是:在Django中,如何保证每个产品仅包含其类别的字段?更准确地说,当指定类别Monitor的产品时,如何确保ProdData表中的字段仅是分辨率屏幕尺寸

我发现了一个类似的问题Django:有关设计具有不同字段的模型的建议,但是没有关于如何确保上述内容的答案。

先感谢您。

用户名

Django是一个出色的框架,但它仍然只是关系数据库的抽象。

您所要询问的内容在关系数据库中不可能高效实现,因此在Django中很难做到。主要是因为在某些时候您的代码将需要转换为表。

基本上有两种方法可以执行此操作:

  1. 一个product与类ManyToMany关系的属性表:

    class Product(models.Model):
        name = models.CharField(max_length=20)
        stock = models.IntegerField()
        price = models.FloatField()
        product_type = models.CharField(max_length=20)  eg. Monitor, desktop, etc...
        attributes = models.ManyToManyField(ProductAttribute)
    class ProductAttribute(models.Model):
        property = models.CharField(max_length=20) # eg. "resolution"
        value = models.CharField(max_length=20) # eg. "1080p"
    

    但是,围绕具有某些属性的某些类的对象的逻辑将丢失。

  2. 使用继承。Django只是Python,继承当然是可能的-实际上,它受到鼓励

    class Product(models.Model):
        name = models.CharField(max_length=20)
        stock = models.IntegerField()
        price = models.FloatField()
    
    class Desktop(Product):
        memory_size = models.CharField(max_length=20)
        storage_size = models.CharField(max_length=20)
    class Monitor(Product):
        resolution = models.CharField(max_length=20)
        screen_size = models.CharField(max_length=20)
    

    然后,您可以查询所有产品-Products.objects.all()或仅查询Monitors-Monitor.objects.all()`-等等。这会用代码对可能的产品进行硬编码,因此,新的产品类型需要进行数据库迁移,但是它还使您能够将业务逻辑嵌入模型本身。

这两种方法都需要权衡取舍,因此选择取决于您。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改模型中的字段/属性值-Laravel

来自分类Dev

为Django模型中所有实体的属性设置相同值的有效方法

来自分类Dev

如何从Django模型获取属性值

来自分类Dev

基于属性值的Django模型继承?

来自分类Dev

如何遍历具有特定属性值的ActiveRecord模型对象?

来自分类Dev

使用Sunspot查询具有不同属性的多个模型

来自分类Dev

使用Sunspot查询具有不同属性的多个模型

来自分类Dev

抽象的Django模型没有“模型”属性?

来自分类Dev

基于属性值变更的查询Rails模型

来自分类Dev

ActiveRecord模型的无限任意属性(键/值对)

来自分类Dev

BackboneJS:迭代模型属性并更改值

来自分类Dev

将模型中的值存储在属性中

来自分类Dev

发布后更改模型中属性的值

来自分类Dev

模型的继承属性始终返回Null值

来自分类Dev

发送模型属性的值作为ajax参数

来自分类Dev

从xml元素值设置模型属性

来自分类Dev

用于多个属性值的模型绑定 MVC

来自分类Dev

无法为模型的属性设置新值

来自分类Dev

在Django中使用具有相同值的不同模型字段

来自分类Dev

在Django中使用具有相同值的不同模型字段

来自分类Dev

Django模型属性和模型中名称不同的数据库字段

来自分类Dev

具有select_related的Django访问主模型属性

来自分类Dev

如何获得具有最大字段值的Django模型?

来自分类Dev

如何在Django的模型中增加和属性的值?

来自分类Dev

使用Spring的MockMvc框架,如何测试模型属性的属性值?

来自分类Dev

使用属性修改模型字段Django

来自分类Dev

在Django中访问模型字段和属性

来自分类Dev

Yii模型属性显示空值/空白值

来自分类Dev

Django测试模型属性

Related 相关文章

热门标签

归档