我正在做一些原型,有一个像这样的简单模型class SampleModel(models.Model):
user_id = models.IntegerField(default=0, db_index=True)
staff_id = models.IntegerField(default=0, db_index=True)
timestamp = models.DateTimeField(default=timezone.now, db_index=True)
objects = AsOfManager()
现在我们需要执行需要self join的查询,它是用原始SQL编写的,如下所示:
^{pr2}$
此查询应该为每个用户返回按时间戳排序的最后一行。每个“链”(与用户_id相关的行)可能有数千行。在
现在我可以使用原始SQL,但是我失去了可组合性,我想返回另一个queryset。
同时,如果能让编写原始SQL更容易一些,那么我想我可以使用一个数据库视图。在
景色可能是这样的CREATE VIEW no_chain_sample_model_with_max_date AS SELECT user_id AS id, MAX(timestamp) AS timestamp
FROM no_chain_samplemodel
GROUP BY user_id;
因此,引用视图的模型可以是这样的:class SampleModelWithMaxDate(models.Model):
class Meta:
managed = False
db_table = 'no_chain_sample_model_with_max_date'
id = models.IntegerField(default=0, primary_key=True)
timestamp = models.DateTimeField(default=timezone.now, db_index=True)
但也存在一些问题:即使managed=False/管理.pymakemigrations'仍然为这个表创建迁移。
我甚至试图将迁移留在那里,但是用原始SQL替换模型来创建视图
但运气不好。
我现在需要做select\u相关联的两个表和查询,但是我应该怎么做呢?在
我在SampleModel上尝试了一个外键,如下所示:
截止日期=模型.ForeignKey(SampleModelWithMaxDate,null=True)
但这也行不通:
操作错误:(1054,“未知列”“无链”“样本”“模型”“带最大值”_日期按日期'在'字段列表')
所以一般来说,我甚至不确定是否有可能,我可以看到其他人使用带视图的模型,只是为了查询对我也有效的独立模型,但是有没有可能做比这更聪明的事情?在
谢谢