python - Django 模型/SQL 如何确定查询中想要的“GROUP BY”部分?
问题描述
我有一个像这样的 Django 模型 ProjectName:
class ProjectName(models.Model):
name = models.CharField(_("name"), max_length=255)
hasused = models.BooleanField()
def __str__(self):
return self.name
class Meta:
managed = False
db_table = 'timeentry_project'
这是一个数据库视图,我的目标是将最近的项目放在视图的顶部并删除任何重复项,以便能够将查询集作为参数提供给 ModelChoiceField。这也是为什么 ProjectName.objects.raw 查询不能解决问题的原因。ModelChoiceField 不接受原始查询集。这也是我不能使用包含重复项的集合的原因。
目前的情况是我有以下查询集(Django queryset for that is OK)内容:
ID Name hasbeenused
81 Mossefixaus 1
80 Ladojen korjaus 0
81 Mossefixaus 0
82 Wartburg autojen koneremontit 0
“已使用”列中的布尔值表明该项目之前是否已处理。使用过的应该在列表的顶部。
问题是我无法创建会产生正确结果集的 Django 查询:
ID Name max
81 Mossefixaus 1
80 Ladojen korjaus 0
82 Wartburg autojen koneremontit 0
以下 SQL 查询将给出该结果:
SELECT "timeentry_project"."id", "timeentry_project"."name", MAX("timeentry_project"."hasbeenused") AS max FROM "timeentry_project" GROUP BY "timeentry_project"."id" ORDER BY "timeentry_project"."hasbeenused" DESC;
这是该 SQL 子句的 Django 应用程序:
project=ProjectName.objects.values("id").annotate(max=Max("hasbeenused")).order_by("-hasbeenused")
该 Django 代码生成的 SQL 子句是:
SELECT "timeentry_project"."id", "timeentry_project"."name", MAX("timeentry_project"."hasbeenused") AS max FROM "timeentry_project" GROUP BY "timeentry_project"."id", "timeentry_project"."hasbeenused" ORDER BY "timeentry_project"."hasbeenused" DESC;
我根本找不到任何解决方案来生成我需要的 SQL 查询。
请注意,查询中不需要的部分是: GROUP BY 子句中的 "timeentry_project"."hasbeenused"。我不明白为什么 Django 会将该部分添加到查询中。我花了很多时间从网上找到解决方案,但似乎没有。据我所知,这可能是许多程序员会遇到的问题。
如果不需要对行进行排序,则可以使用空的 .order_by() ,这将消除不需要的部分。但是,如果未对行进行排序,则整个查询将毫无用处。
解决方案
推荐阅读
- sql - ORA-01427: 单行子查询返回多行更新
- css - 在 CSS 中计算 calc 的最大值
- javascript - 在 Javascript 中设置 Google ReCaptcha
- iis - IIS URL 重写和 ARR 不能正确处理重写规则
- redis - Traefik - 无法为不同域公开具有相同端口的 redis docker 容器
- react-native - nativebase 自动完成无法找到
- c++ - 设置常量缓冲区 Directx
- django - /edit/ __init__() 的 TypeError 获得了参数“数据”的多个值
- linux - 如果还没有换行符,则在匹配模式的行之前创建换行符
- sql - 我可以在没有定义外部表的情况下使用 postgres_fdw 吗?