django模型中的任意类型数据

django模型中的任意类型数据,django,Django,比如说,我有一个模型。我想在上面存储任意数量的属性,比如标题、描述、发布日期。我希望它们不仅仅是字符串,而且是python类型的,比如字符串、布尔值、日期时间等等 我的选择是什么?具有单独名称-值表的EAV模式将不起作用,因为所有值的DB类型都相同。JSONField可能会有所帮助,但它不知道datetime,例如。我也在看PickeField,它非常适合,但我有点担心性能。您有几个选择,但没有一个是好的。其中一些已经在堆栈溢出方面进行了讨论 首先,正如您所建议的,您有实体属性值设计模式 您可以

比如说,我有一个模型。我想在上面存储任意数量的属性,比如标题、描述、发布日期。我希望它们不仅仅是字符串,而且是python类型的,比如字符串、布尔值、日期时间等等


我的选择是什么?具有单独名称-值表的EAV模式将不起作用,因为所有值的DB类型都相同。JSONField可能会有所帮助,但它不知道datetime,例如。我也在看PickeField,它非常适合,但我有点担心性能。

您有几个选择,但没有一个是好的。其中一些已经在堆栈溢出方面进行了讨论

首先,正如您所建议的,您有实体属性值设计模式

您可以通过一个用于VARCHARs的表、一个用于int的表和一个用于boolean的表等来添加DB类型检查。 EAV使选择非常痛苦。您必须查询多个表才能实际获取对象,如果必须在查找中使用EAV表中的值,那么随着大小的增加,您将遇到性能问题。 然而,一般来说,EAV实际上应该只用于非常稀疏的数据,而其他选项根本不起作用。 PyPI上有一个Django包,但是我没有使用它。 我见过一些相当大规模的商业产品在绝对需要大量灵活性时使用这种方法 一种稍微好一点的方法是使用一个模式发生更改的表和一个描述该表的元数据表。对于大多数项具有大多数属性的密集数据,这比EAV有很多优势。这种方法有时称为动态表或动态行

插入、更新和删除速度更快,因为所有内容都在1-2个表中 可以添加类型检查和潜在的约束 然而,这种方法会留下一个非常复杂的数据库,很难使用 我不知道Django会以何种方式将其ORM用于这种数据库,因为您的模型会在动态变化。 您正在使用ALTERTABLE动态更改数据库。你最好小心你的交易 如果您不需要基于这些动态属性执行查找,那么一个好方法是将动态数据存储在JSONField中,或者更好的方法是存储在经过模式验证的XMLField中。但是,如果必须基于JSON或XML中的动态属性进行查找,则查找将非常痛苦


最佳方法取决于数据的稀疏程度以及查找数据的方式。另外,一个很好的问题是,你是否绝对需要这种灵活性。我曾参与过一些我们认为需要EAV的项目,但由于该项目投入生产,属性很少被添加和删除,因此我们得到了所有的缺点,没有任何好处。

您有几个选择,但没有一个是好的。其中一些已经在堆栈溢出方面进行了讨论

首先,正如您所建议的,您有实体属性值设计模式

您可以通过一个用于VARCHARs的表、一个用于int的表和一个用于boolean的表等来添加DB类型检查。 EAV使选择非常痛苦。您必须查询多个表才能实际获取对象,如果必须在查找中使用EAV表中的值,那么随着大小的增加,您将遇到性能问题。 然而,一般来说,EAV实际上应该只用于非常稀疏的数据,而其他选项根本不起作用。 PyPI上有一个Django包,但是我没有使用它。 我见过一些相当大规模的商业产品在绝对需要大量灵活性时使用这种方法 一种稍微好一点的方法是使用一个模式发生更改的表和一个描述该表的元数据表。对于大多数项具有大多数属性的密集数据,这比EAV有很多优势。这种方法有时称为动态表或动态行

插入、更新和删除速度更快,因为所有内容都在1-2个表中 可以添加类型检查和潜在的约束 然而,这种方法会留下一个非常复杂的数据库,很难使用 我不知道Django会以何种方式将其ORM用于这种数据库,因为您的模型会在动态变化。 您正在使用ALTERTABLE动态更改数据库。你最好小心你的交易 如果您不需要基于这些动态属性执行查找,那么一个好方法是将动态数据存储在JSONField中,或者更好的方法是存储在经过模式验证的XMLField中。但是,如果必须基于JSON或XML中的动态属性进行查找,则查找将非常痛苦

最佳方法取决于数据的稀疏程度以及查找数据的方式。另外,一个很好的问题是,你是否绝对需要这种灵活性。我曾参与过一些我们认为需要EAV的项目,但自从项目投入生产后,属性变得非常重要 很少添加和删除,所以我们得到了所有的缺点,没有任何好处