Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
每类SQL向ORM的最后N篇文章_Sql_Django_Django Models_Django Queryset_Django Orm - Fatal编程技术网

每类SQL向ORM的最后N篇文章

每类SQL向ORM的最后N篇文章,sql,django,django-models,django-queryset,django-orm,Sql,Django,Django Models,Django Queryset,Django Orm,我正在启动我的第一个Django博客应用程序[在完成Django官方教程和Django女孩教程之后]。我的头缠在Django ORM身上有点困难。我有这个SQL查询可以工作,但我觉得它效率很低,我宁愿在继续之前先学习正确的方法 Post.objects.raw(('SELECT * FROM (SELECT id, category, body, slug, author, title, published, row_number() OVER (PARTITION BY category)

我正在启动我的第一个Django博客应用程序[在完成Django官方教程和Django女孩教程之后]。我的头缠在Django ORM身上有点困难。我有这个SQL查询可以工作,但我觉得它效率很低,我宁愿在继续之前先学习正确的方法

Post.objects.raw(('SELECT * FROM (SELECT id, category, body, slug, author, title, 
published, row_number() OVER (PARTITION BY category) as rownum FROM post) tmp 
WHERE rownum < 5'))

我花了几个小时试图通过ORM让它工作,但没能让它工作。我最终在原始SQL中完成了这项工作,但我不知道还会运行20多个查询。主要目标是按发布日期显示每个类别的最后5篇文章。我正在使用PostgreSQL。

我想你想要最后3篇文章,如果是这样的话,你可以切片

def mayview(request):
    last_posts = Post.objects.all().order_by('-created_at')[:3]  # list of last posts
    return render(request, 'path/to/template', {'last_posts': last_posts})
在模板中,使用for循环解压缩列表:

{%for post in last_posts%}

<h1>{{post.title}}</h1>
<p>{{post.body}}</p>
<small>{{post.created_by}}</small>

{% endfor %}

你的解决方案几乎完成了

from django.db.models.expressions import RawSQL

qs = Post.objects.filter(pk__in=RawSQL(
    'SELECT id FROM '
    '  (SELECT id, '
    '    row_number() OVER (PARTITION BY category ORDER BY published DESC) as rownum '
    '   FROM post) tmp '
    'WHERE rownum < 5',
    []
)).order_by('category', '-published')

可以在Django 2.0中使用,而不是在RawSQL中使用。应该在2.0版本后更新

posts=Post.objects.all.annotateCountcategory.order_by'category',“-published”这更像我需要的,但我需要每个类别5篇文章如果我使用slice,那么它只返回最后5篇文章。因此,如果有4个类别和n个数量的职位在每个我只需要5个职位,每个类别使用上面的代码订购。+1。你的解决方案几乎完成了。一个小的修正是必要的,以获得正常的对象和真正的最后5篇文章,而不是随机5篇文章。