Python 基于模型字段限制查询集结果,有更好的方法吗?
基本上,我想为每个主机获取最新的30个日志条目。目前我在django活塞公司做这项工作Python 基于模型字段限制查询集结果,有更好的方法吗?,python,django,django-queryset,django-piston,Python,Django,Django Queryset,Django Piston,基本上,我想为每个主机获取最新的30个日志条目。目前我在django活塞公司做这项工作 def read(self,request): val={} for x in Host.objects.all(): val[x.uuid_id]=DataLog.objects.filter(host=x).order_by('-time')[:30] return val 不幸的是,这个请求需要很长的时间(目前大约10k个数据库条目需要1s
def read(self,request):
val={}
for x in Host.objects.all():
val[x.uuid_id]=DataLog.objects.filter(host=x).order_by('-time')[:30]
return val
不幸的是,这个请求需要很长的时间(目前大约10k个数据库条目需要1s)。
有没有更有效的方法
Harper如果您使用PostgreSQL作为数据库后端,并且不需要跨数据库兼容性,则可以使用允许以下内容的:
CREATE TABLE x (
i serial primary key,
value integer not null,
date timestamp,
category text);
想象一下你的桌子是这样的:
CREATE TABLE x (
i serial primary key,
value integer not null,
date timestamp,
category text);
您需要每个类别的最新值。你将做:
SELECT
first_value(i) over w,
first_value(value) over w,
first_value(date) over w
category,
FROM x
WINDOW w AS (PARTITION BY category ORDER BY date DESC);
您可以通过查询集管理器上的raw
方法在django中使用此类查询:
ModelX.objects.raw("""SELECT DISTINCT ....... FROM x WINDOW w .....""")
要按类别获取最后N个条目,查询稍微复杂一些,并且涉及一个子查询:
SELECT i, value, date, category
FROM (SELECT
i, value, date, category,
row_number() over w
FROM x
WINDOW w AS (PARTITION BY category ORDER BY date DESC)) AS subquery
WHERE subquery.row_number <= 30;
并创建查询此视图的django模型:
class ModelX(models.Model):
...
...
row_number = models.IntegerField("Row number when ordering by date desc")
class Meta:
db_table = 'x_with_reverse_date_index'
并“正常”查询:
警告:同样,如果您需要在另一个数据库引擎上运行的代码,请不要这样做。这是一个常见的问题,除了原始SQL之外,没有单一的查询解决方案。查找“TopN GROUP BY”以查找有关SQL的帮助。当我的FAQ需要每个类别前N个问题时,我首先编写了原始SQL,然后在代码更改后决定放弃这个想法,只缓存结果:)将每个主机的最后30行保留在不同的表中(例如LatestDataLog)如何?在创建数据日志时使用一个信号,将数据日志id保存在LatestDataLog&purge记录中,主机的记录超过30行。我认为您的标题选择得很糟糕。我曾经问过“如何按类别获得前N个条目”
ModelX.objects.filter(category__in = ('catA','catB'), row_number__lte = 30)
ModelX.objects.filter(row_number = 29)
...