【问题标题】:Django get results from multiple rows into a list?Django将多行的结果放入列表中?
【发布时间】:2017-03-09 04:22:54
【问题描述】:

例如,我有以下模型:

class Author(models.Model):
    firstname = models.CharField(max_length=30)
    book = models.CharField(max_length=30)

我想让我的模板做一些导致下面的 html 的事情。因此,对于每个具有相同名字的作者,它会迭代并使用具有该名字的作者的所有书籍填充列表。

<h3>Author First Name</h3>
<ul>
    <li>Book1</li>
    <li>Book2</li>
    <li>Book3</li>
</ul>
<h3>Author First Name2</h3>
<ul>
    <li>Book4</li>
    <li>Book9</li>
</ul

我不确定如何构建一个允许我这样做的 Django 查询集。

【问题讨论】:

  • 你的模型设计太糟糕了,你不能写这样的查询。首先学习如何使用 ForeignKey 或 OneToManyField 或 ManyToManyField 设计模型。祝你好运:)
  • 要为@AshrafulIslam 的评论提供更多细节 - 您应该有另一个名为 Book 的模型,它通过 ForeignKey 或其他关系链接到 Author
  • 感谢您的建议。外键解决方案是我想要的。

标签: python html django templates


【解决方案1】:

您可能必须在视图函数中完成其中的一些工作。

L1 = Author.objects.all().order_by('firstname').values('firstname', 'book')

将返回记录列表。

from itertools import group_by
from operator import itemgetter

group_by(L1, itemgetter('firstname'))

将为您提供一个作者列表以及每位作者的书籍。

假设您将其作为list1 传递给您的模板。然后在您的模板中,您可以执行以下操作:

{% for k, v in list1 %}
    <h3>{{ k }}</h3>
    <ul>
    {% for b in v %}
        <li>{{ b }}</li>
    {% endfor %}
    </ul>
{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2019-12-18
    • 1970-01-01
    • 2012-09-11
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多