2016-04-29 62 views
3

我需要實現一個相當標準的實體屬性值層次結構。有多種類型的設備,每種類型都有一系列的設置,每個設備都有一組特定的值。似乎django-eav和eav-django包都不再維護,所以我想我需要自己推出。但我如何設計這個?到目前爲止,我在想這樣的事情(跳過很多細節)如何在Django中實現EAV

 
class DeviceType(Model): 
    name = CharField() 

class Device(Model): 
    name = CharField() 
    type = ForeignKey(DeviceType) 

class Setting(Model): 
    name = CharField() 
    type = CharField(choices=(('Number', 'int'), ('String', 'str'), ('Boolean', 'bool'))) 
    device_type = ForeignKey(DeviceType) 

class Value(Model): 
    device = ForeignKey(Device) 
    setting = ForeignKey(Setting) 
    value = CharField() 

    def __setattr__(self, name, value): 
     if name == 'value': 
      ... do validation based on the setting type ... 

    def __getattr__(self, name): 
     if name == 'value': 
      ... convert string to whatever is the correct value for the type ... 

我錯過了什麼嗎?有沒有更好的方法來做到這一點?這會工作嗎?

回答

-1

我想回答,讓我知道,我們是在同一架飛機上。我想,你需要先制定EAV數據庫scema。爲了確定什麼是實體,屬性和相關的值。在這裏,在你提到的例子中,實體可能是設備,它的屬性可能是設置。如果我們舉另一個例子,比如在汽車銷售的情況下,實體是銷售收益者,屬性是客戶購買的產品(汽車),價值是價格,汽車模型,汽車顏色等。 製作存儲映射的主表和表格如果有的話。 models.py中的這個模式實現將使您的模型變爲模型,並通過shell或插入腳本在這些模型中插入值。

+2

首先,您可能會注意到這個問題是在四月份提出的。之後我實現了我在問題中發佈的代碼版本。儘管我寧願有一個更易於管理的解決方案,但它對我來說工作起來相當不錯。其次,你的答案是非常通用的。你甚至知道Django? –

+0

有沒有機會使用django-eav?過濾根本不起作用。 – iMitwe

+0

@iMitwe不,當我尋找這個答案時,django-eav幾乎死在水中,所以我根據上面的代碼推出了一個有限版本。 –