【问题标题】:query foreign key table for list view in django在 django 中查询列表视图的外键表
【发布时间】:2018-05-25 19:56:31
【问题描述】:

我对 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 程序员编写的。

【问题讨论】:

  • 可以调用.author属性获取作者,并在模板中渲染。

标签: python django


【解决方案1】:

如果你给另一个模型定义了一个名为columnForeignKey,那么Django会构造一个名为column_id的数据库列来获取相关对象的主键。但是你可以使用.column获取相关对象(所以不是id,而是那个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(..) 通常更有效:

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

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

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

【讨论】:

  • 您是否有任何关于此的文档链接,以便我可以阅读有哪些外键查询选项?还有其他页面/区域我需要获得许多外键结果...
  • @UndefinedVariable:我认为ForeignKey 上的文档可能是一个好的开始:docs.djangoproject.com/en/2.0/ref/models/fields/… 老实说,Django 有一个非常好的文档。
  • 再次感谢您,非常感谢您的帮助。
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2022-11-23
  • 2018-09-01
  • 1970-01-01
  • 2020-07-02
  • 2021-11-30
相关资源
最近更新 更多