Django:具有可变字段的模型(EntityAttributeValue模型)

2024-05-29 03:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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)

其思想是将每个产品的名称库存价格存储在一个表中,并将每个产品的信息以(id)格式存储在另一个表中。在

我知道,一个先验的,每个产品类别应该有字段。例如,一款台式机的产品应该有内存大小存储大小作为字段,而另一种监视器类产品应具有分辨率屏幕大小的字段。在

我的问题是:在Django中,如何保证每个产品只包含其类别的字段?更准确地说,当指定类别监视器的产品时,如何确保只有分辨率屏幕大小是ProdData表中的字段?在

我发现了一个类似的问题Django: Advice on designing a model with varying fields,但没有关于如何保证上述问题的答案。在

提前谢谢你。在


Tags: djangomodel产品models错误productlengthmax
1条回答
网友
1楼 · 发布于 2024-05-29 03:26:40

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

您所要求的在关系数据库中不可能有效地实现,因此在Django中很难做到。主要是因为在某些时候你的代码需要转换成表。在

基本上有两种方法可以做到:

  1. 与属性表具有ManyToMany关系的product类:

    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,继承当然是可能的-in fact its encouraged

    ^{pr2}$

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

这两种方法都有权衡,你需要决定,所以选择取决于你。在

相关问题 更多 >

    热门问题