Django模型有数百个字段

时间:2016-02-09 08:55:03

标签: python django

我有一个包含数百个属性的模型。属性可以是不同的类型(整数,字符串,上传文件,......)。我想从最重要的属性开始,逐步实现这个复杂的模型。我可以想到两个选择:

  1. 将属性定义为常规模型字段
  2. 定义一个单独的模型以分别保存每个属性,并使用ForeignKey
  3. 将其链接到主模型

    我没有找到任何关于如何使用django处理具有大量属性的模型的建议。这两种方法的优点/缺点是什么?

3 个答案:

答案 0 :(得分:4)

你绝对应该将你的属性定义为ForeignKeys。每次需要完整模型时,数据库服务器都必须生成数百个JOINs,因此会破坏您的性能。

如果几乎​​每次访问模型时都需要您的属性,则应将它们保存在同一模型中。如果没有,您可以制作单独的Properties模型,并通过OneToOneField将其链接到原始模型。

我个人有过这样的经历。我们必须建立一个酒店推荐引擎,然后我们使用Drupal。当Drupal将每个自定义属性存储在一个单独的MySQL表中时,我们很快意识到我们应该切换框架,因为每个查询都会破坏我们的生产服务器(20多个JOIN对MySQL来说是致命的)。顺便说一下,我们最终使用了基于ElasticSearch的自定义解决方案,可以很好地处理数百个字段。

更新:如果您有幸使用最新版本的PostgreSQL,您可以利用JSONField存储将所有字段打包到单个模型字段中。但请注意,您必须自己实施验证方案。

答案 1 :(得分:2)

  

客户要求。

首先,我感受到你的痛苦并祝你万事如意!我想重申一下,如果你不应该首先考虑更改它,因为在单个对象上永远不需要数百个属性,它通常表明需要数组,继承或单独的类等。

展望未来,您需要大量使用valuesvalues_list才能从数据库中返回实际需要的属性,因为性能将严重削弱。< / p>

由于您无法对模型执行任何操作,因此您应该尝试从设计方面解决性能问题。 single responsibility principle应该在您的网站中占据重要位置,这意味着您只需要从模型中返回一些值。这样,你选择的选项真的不会有什么不同,因为返回的内容将非常有限。

尽可能过滤,并谨慎使用。

答案 2 :(得分:0)

您可以将它们分组到几个单独的模型中,由OneToOneFields链接到主模型。这将“命名”您的数据,名称空间是“一个很棒的主意”。