如何在 Django 中自动查询?
Posted
技术标签:
【中文标题】如何在 Django 中自动查询?【英文标题】:How to query automatically in Django? 【发布时间】:2020-05-14 07:36:57 【问题描述】:我可以通过显式提供“Id”来检索数据,但我想自动检索前 3 个“Id”数据。我怎样才能做到这一点。请检查我下面的代码并帮助我
这是models.py
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.title
这是 admin.py
class PostAdmin(admin.ModelAdmin):
list_display = ('id','title')
admin.site.register(Post, PostAdmin)
这是views.py
def index(request):
post3 = get_object_or_404(Post, id=3)
post2 = get_object_or_404(Post, id=2)
post1 = get_object_or_404(Post, id=1)
context =
"post3": post3,
"post2": post2,
"post1": post1,
return render(request, 'contents/index.html', context)
正如您在上面看到的,我给出了 id 号,它工作正常,但我希望它自动检索顶部 id
这是我的模板
<h3>post3.title</h3>
<h3>post2.title</h3>
<h3>post1.title</h3>
【问题讨论】:
Post.objects.order_by('-id')[:3]
【参考方案1】:
您可以只在查询集上使用切片(它会自动将 LIMIT 添加到 SQL 查询中)或获取索引指定的对象:
posts = Post.objects.all()[:3] # 3 first objects
posts = Post.objects.order_by("-id")[:3] # 3 last objects
post = Post.objects.last() # last object
post = Post.objects.order_by("-id")[0] # also last object, but it's better to use `last` in such case
post = Post.objects.order_by("-id")[1] # pre-last object
将其传递给上下文:
context = "posts": posts
然后你可以在模板中处理这个查询集:
% for post in posts %
<h3> post.title </h3>
% endfor %
【讨论】:
感谢您的回复,所以这个“posts = Post.objects.order_by("-id")[:3]”会给我最后 3 个对象,但是如果我特别想要一个对象是倒数第二个对象 在这种情况下,您可以使用:post = Post.objects.order_by("-id")[1]
(所以它不是最后创建的对象,而是前一个对象)
我尝试运行代码 "Post.objects.order_by("-id")[:0]" 这会给我 404, "Post.objects.order_by("-id")[: 1]" 这给了我最后一个对象,当我尝试 "Post.objects.order_by("-id")[:2]" 它给了我最后一个和倒数第二个对象但我想要的只是倒数第二个
这是因为您使用的是:
,它正在制作切片。如果您只想接收一个对象,则仅使用 [1]
而不使用 :
非常感谢。从上周开始我就完全糊涂了。你帮了我很多【参考方案2】:
您应该在 views 中查询,例如 posts = Post.objects.all()[0:3]
,然后在 template 中使用 for 循环
% for post in posts %
post.title
如果你想创建DetailView,你可以通过模板传递post.id并将它作为参数添加到视图中,然后Post = get_object_or_404(id=post_id)
【讨论】:
以上是关于如何在 Django 中自动查询?的主要内容,如果未能解决你的问题,请参考以下文章