首页 > 解决方案 > 在 django 中查询列表视图的外键表

问题描述

我对 Django 很陌生。我有一个 django 安装,并试图在 django 中为一些数据库表创建一个 UI。

在我的数据库中有两个表 - 文章和作者。Articles 表具有 Author 表的外键,字段名称为 author_id。

我设法创建了一个列出文章的 ListView 类。代码是这样的:

from .models import Article

class ArticleListView(ListView):
    template_name = "article.html"
    context_object_name = 'articles'
    paginate_by = 25

    def get_queryset(self):
        queryset = Article.objects.all().order_by('-created_at')
        return queryset 

然后在视图中我循环文章查询集并打印它的字段,这工作正常。但是我不确定如何查询相应的作者表以获取作者姓名和详细信息。谁能帮我理解如何做到这一点?我阅读了很多关于此的文档/教程,但我无法理解如何做到这一点。很感谢任何形式的帮助。

请注意:文章模型是由早期的 django 程序员编写的。

标签: pythondjango

解决方案


如果你给另一个模型定义了一个ForeignKey带有名字的名字column,那么Django会用名字构造一个数据库列column_id来获取相关对象的主键。但是您可以使用.column来获取相关对象(所以不是id,而是 that 的对应对象id)。

因此,您可以更改模板,例如:

<h1>Articles</h1>
<ul>
{% for article in object_list %}
    <li>{{ article.pub_date|date }} - {{ article.headline }}
         - {{article.author.name}}</li>
{% empty %}
    <li>No articles yet.</li>
{% endfor %}
</ul>

(当然给定author一个name字段)。

由于您将在此处获取所有prefetch_related(..)作者对象,因此在这种情况下对查询集执行 a 通常更有效:

class ArticleListView(ListView):
    template_name = 'article.html'
    paginate_by = 25

    def get_queryset(self):
        return Article.objects..prefetch_related(
            'author'
        ).order_by('-created_at')

因此,您可以调用.author任何Article 实例来获取Author与其相关的对象(例如获取该作者的属性、修改作者等)。


推荐阅读