如何在Django中实现EAV

时间:2016-04-29 15:08:29

标签: python django entity-attribute-value

我需要实现一个相当标准的实体 - 属性 - 值层次结构。存在多种类型的设备,每种类型具有它可以具有的一组设置,每个单独的设备具有针对每个设置的一组特定值。似乎django-eav和eav-django软件包都不再维护,所以我想我需要自己动手。但是我该如何构建这个呢?到目前为止,我正在考虑这样的事情(跳过很多细节)

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 ...

我错过了什么吗?有没有更好的方法呢?这有用吗?

2 个答案:

答案 0 :(得分:0)

这个问题在很长一段时间内都没有得到解答,与此同时,情况发生了变化。特别是,一个叉子是由 django-eav 制成的。它是Django EAV 2

也许使用 EAV 模型的需要并不经常发生,所以找到这个存储库不是立即的。

我很抱歉没有对这个问题进行深入的回答,但我也刚刚开始使用这个库,所以我宁愿避免给出不准确的指示。

不过,我相信这个链接可以为任何需要它的人节省时间。

答案 1 :(得分:-1)

我想回答,让我知道,我们在同一架飞机上。我想,你需要首先制定EAV数据库scema。为此,确定实体,属性和关联值。在这里,在您提到的示例中,实体可能是设备,它的属性可能是设置。如果我们采取其他例子,比如说在汽车销售的情况下,实体是销售收件人,属性是顾客(汽车)购买的产品,价值是价格,汽车模型,汽车颜色等。 创建存储映射的主表和表(如果有)。 models.py中的这种模式实现将创建模型,并通过shell或插入脚本在这些模型中插入值。