Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于模型字段限制查询集结果,有更好的方法吗?_Python_Django_Django Queryset_Django Piston - Fatal编程技术网

Python 基于模型字段限制查询集结果,有更好的方法吗?

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

基本上,我想为每个主机获取最新的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)。 有没有更有效的方法


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)
...