3

是否可以像 Google App Engine 那样在 Django 中实现“expando”模型?我在 github 上找到了一个名为 django-expando 的 django 应用程序,但它仍处于早期阶段。

4

1 回答 1

2

这是可能的,但这将是史诗般的拼凑。GAE 使用一种不同的数据库设计,称为基于列的数据库,而 Django ORM 旨在与关系数据库链接。由于从技术上讲,GAE 中的所有内容都存储在一个没有模式的非常大的表中(这就是您不必syncdb为 GAE 应用程序存储的原因),因此添加任意字段很容易。对于关系数据库,每个表(通常)只存储一种数据并且具有固定的模式,任意字段并不那么容易。

一种可能的实现方法是为 expando 属性创建一个新模型或表,该属性存储表名称、对象 ID 和用于腌制数据的 TextField,然后让所有 expando 模型从覆盖的子类继承__setattr____getattr__方法将自动在此表中创建一个新行。但是,这样做有几个主要问题:

  • 首先,这是一种廉价的 hack,并且与关系数据库的原则背道而驰。
  • 其次,如果没有更多的hack,就不可能查询这些expando字段,即使这样它也会非常慢。

我的建议是找到一种方法来设计您的数据库结构,这样您就不需要 expando 模型。

于 2010-02-02T16:12:18.903 回答