簡體   English   中英

Django:具有不同字段的模型(實體-屬性-值模型)

[英]Django: Model with varying fields (Entity-Attribute-Value model)

我有以下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. 與屬性表具有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,繼承當然是可能的- 實際上,它受到鼓勵

     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() -或者只是監視器- Monitor.objects.all()` -等。 這用代碼對可能的產品進行了硬編碼,因此,新的產品類型需要進行數據庫遷移,但是它還使您能夠將業務邏輯嵌入模型本身。

這兩種方法都需要權衡取舍,因此選擇取決於您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM