如何在 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 中自动查询?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 Django 中查询评论

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

MySQL 查询:如何在 Django 中编写?

如何在 Django 中执行此连接查询

如何在 Django 中查看表单和查询集?

如何在 django 中使用模型进行查询