我在django
中有两个基本模型,分别名为Applications
和Status
,还有一个用于跟踪应用程序状态的模型,名为TrackApplicationStatus
。因此,每当应用程序的状态发生变化时,就会向TrackApplicationStatus
表中添加一条新记录。每个应用程序的当前状态是该表的最新记录的状态
这些模型的定义如下:
from django.db import models
class Application(models.Model):
name = models.CharField(max_length=100)
class Status(models.Model):
name = models.CharField(max_length=100, blank=False, unique=True)
class TrackApplicationStatus(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
application = models.ForeignKey(Application, on_delete=models.CASCADE, related_name='statuses')
status = models.ForeignKey(Status, on_delete=models.SET_NULL, related_name='applications_status', null=True)
class Meta:
get_latest_by = ['created_at']
ordering = ['-created_at']
在第一步中,我使用以下django查询检索每个应用程序的当前状态:
current_statuses = TrackApplicationStatus.objects.order_by('application_id', '-created_at').distinct('application_id')
生成的SQL查询如下所示:
SELECT
DISTINCT ON ("api_trackapplicationstatus"."application_id")
"api_trackapplicationstatus"."id",
"api_trackapplicationstatus"."created_at",
"api_trackapplicationstatus"."application_id",
"api_trackapplicationstatus"."status_id"
FROM "api_trackapplicationstatus"
ORDER BY
"api_trackapplicationstatus"."application_id" ASC, "api_trackapplicationstatus"."created_at" DESC
我接下来要做的是获取所有具有特定状态的应用程序。在SQL术语中,我将对上述结果表应用WHERE
子句,如下所示:
SELECT sub.application_id
FROM
(
SELECT DISTINCT ON ("api_trackapplicationstatus"."application_id")
"api_trackapplicationstatus"."created_at",
"api_trackapplicationstatus"."application_id" as application_id,
"api_trackapplicationstatus"."status_id" as status
FROM "api_trackapplicationstatus"
ORDER BY "api_trackapplicationstatus"."application_id" ASC,
"api_trackapplicationstatus"."created_at" DESC
) AS sub
WHERE sub.status = 3
如何使用django ORM获取相同的数据
你不需要3个模型。这可以简单地在1个模型中完成
如下定义您的模型:
现在,您只需根据应用程序的状态筛选它们:
我找到了一个不太好的方法:
相应的SQL为:
相关问题 更多 >
编程相关推荐