如何在Django模型中存储任意名称/值键对?

Mik*_*keN 9 django django-models

我有一个固定的数据模型,有很多数据字段.

class Widget(Models.model):
    widget_owner = models.ForeignKey(auth.User)
    val1 = models.CharField()
    val2 = models.CharField()
    ...
    val568 = ...

我想通过让我的用户指定自定义数据字段来将更多数据填充到此Widget中.什么是理智的方式来做到这一点?存储名称/值对,用户可以指定其他"窗口小部件字段"是个好主意吗?我的伪想法如下:

data_types = ('free_text', 'date', 'integer', 'price')
class CustomWidgetField(models.Model)
  owner = ForeignKey(auth.User)
  field_title = models.CharField(auth.User)
  field_value_type = models.CharField(choices = data_types)

class CustomWidgetValue(models.Model)
  field_type = ForeignKey(CustomWidgetField)
  widget = ForeignKey(Widget)
  value = models.TextField()

所以我想让每个用户构建一个新类型的数据字段,它将应用于所有小部件,然后为每个小部件中的每个自定义字段指定值.我可能不得不像在原生字段上那样对这些自定义字段进行过滤/搜索(我假设它比在本地字段上操作慢得多.)但是规模是每个Widget有几十个自定义字段和每个用户的库存中只有几千个小部件.我也可以将自定义字段的大部分搜索/过滤批量转换为后端脚本(可能.)

Ale*_*dev 22

考虑用序列化的dict表示所有自定义属性.我在最近的一个项目中使用了它,它的效果非常好.

 class Widget(models.Model):
      owner = models.ForeignKey(auth.User)
      props = models.TextField(blank=True) # serialized custom data

      @property
      def props_dict(self):
          return simplejson.loads(self.props)

 class UserProfile(models.Model)
      user = models.ForeignKey(auth.User)
      widget_fields = models.TextField(blank=True) # serialized schema declaration
Run Code Online (Sandbox Code Playgroud)


Pau*_*lan 8

看起来你已经彻底改造了三重商店.我认为这是一个常见的事情,因为我们遵循数据库灵活性的概念来达到其自然结论.在关系数据库系统中,三重存储往往效率很低,但有专门为它们设计的系统.

http://en.wikipedia.org/wiki/Triplestore

在您谈论的规模上,您的表现可能是可以接受的,但如果没有专门的数据库,它们通常不能很好地扩展.