首页 > 解决方案 > 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() ,这将消除不需要的部分。但是,如果未对行进行排序,则整个查询将毫无用处。

标签: pythonsqldjangodjango-modelsgroup-by

解决方案


推荐阅读