获取查询集中每个类别的最新实例

时间:2011-03-04 09:35:57

标签: django django-models

我在这些领域有一个'Thing'模型:

name: TextField
category: TextField
date: DateField

我首先对名称进行icontains查询:

Thing.objects.filter(name__icontaints='substring')

我的问题是如何过滤该结果,只提供每个类别中最新的项目。

如果我得到三个“小部件”类别的结果,我只想在结果集中使用一个小部件 - 最新的小部件。

我天真的解决方案是遍历查询集,保留最近日期的记录并构建新的结果集。有没有更好的办法?最好是在数据库级别工作。

1 个答案:

答案 0 :(得分:2)

不幸的是,由于查询差异很大,所以无法在所有数据库中可靠地执行此操作。

使用MySQL,您可以执行以下操作:

SELECT
    name,
    category,
    date
FROM
    thing
WHERE
    name LIKE '%substring%'
GROUP BY date

使用PostgreSQL会是这样的:

SELECT
    DISTINCT ON (category)
    name,
    category,
    date
FROM
    thing
WHERE
    name LIKE '%substring%'
ORDER BY date DESC

如果您使用的是PostgreSQL,则可以使用此修补程序获得DISTINCT ON支持:http://code.djangoproject.com/ticket/6422