我有以下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,但没有关于如何保证上述问题的答案。在
提前谢谢你。在
Django是一个优秀的框架,但它仍然只是关系数据库的抽象。
您所要求的在关系数据库中不可能有效地实现,因此在Django中很难做到。主要是因为在某些时候你的代码需要转换成表。在
基本上有两种方法可以做到:
与属性表具有
ManyToMany
关系的product
类:但是,对于某些具有特定属性的对象类,您的逻辑将丢失。
使用继承。Django只是Python,继承当然是可能的-in fact its encouraged:
^{pr2}$然后您可以对所有产品进行查询-
Products.objects.all()
-或者只监视-Monitor.objects.all()`-等等。这将可能的产品硬编码在代码中,因此新的产品类型需要数据库迁移,但它也使您能够将业务逻辑嵌入模型本身。这两种方法都有权衡,你需要决定,所以选择取决于你。在
相关问题 更多 >
编程相关推荐