如何在Django中实现EAV

我需要实现一个相当标准的实体属性值层次结构。 有多种类型的设备,每种类型都有一系列的设置,每个设备都有一组特定的值。 似乎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 ...

我错过了什么吗? 有没有更好的方法来做到这一点? 这会工作吗?


我想回答,让我知道,我们是在同一架飞机上。 我想,你需要先制定EAV数据库scema。 为了确定什么是实体,属性和相关的值。 在这里,在你提到的例子中,实体可能是设备,它的属性可能是设置。 如果我们举另外一个例子,比如在汽车销售的情况下,实体是销售收益者,属性是客户购买的产品(汽车),价值是价格,汽车模型,汽车颜色等。制作存储映射的主表格和表格任何。 models.py中的这个模式实现将使您的模型变为模型,并通过shell或插入脚本在这些模型中插入值。

链接地址: http://www.djcxy.com/p/25379.html

上一篇: How to implement EAV in Django

下一篇: Overriding the Model.create() method?