在 Django 中使用物化视图或替代方案

Bar*_*nix 12 python database sql-server django postgresql

我需要aggregate在我的django应用程序中使用一些经常更改的数据,如果我动态进行计算,可能会发生一些性能问题。因此,我需要将aggregate结果保存在表中,并在数据更改时更新它们。因为我使用的django一些选项可能存在,有些可能不存在。例如,我可以使用django signals一个表格,当post_save发出信号时,它会更新结果。另一个选项是materialized viewsinpostgresqlindexed viewsin MSSQL Server,我不知道如何使用 indjango或是否django支持它们。这样做的最佳方法django是提高结果的性能和准确性。

Ale*_*eem 13

您可以在 postgres 中使用物化视图。这很简单。

  1. 您必须创建一个带有查询的视图,例如 CREATE MATERIALIZED VIEW my_view as select * from my_table;
  2. 创建一个具有两个选项的模型,managed=falsedb_name=my_view在模型中Meta像这样

    MyModel(models.Model): class Meta: managed = False db_table='my_view'

  3. 只需使用 ORM 的力量并将 MyModel 视为常规模型。例如MyModel.objects.count()

  • 我遵循了这个方法,并且大部分情况下都有效。但是,当设置从另一个模型到附加到视图表的模型的外键关系或 OneToOne 关系时,我收到以下错误:`django.db.utils.ProgrammingError:引用的关系“MaterializedViewTableName”不是表` 。 (2认同)