【问题标题】:Django ORM for loop to get querysetDjango ORM for 循环获取查询集
【发布时间】:2022-01-18 11:41:34
【问题描述】:

我正在尝试使用 for 循环来获取作者列表以及所写书籍的数量和作者以及所写书籍的标题。 这是我的models.py

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

我试过这样循环:

for a in Author.all():
    books = a.book_set.order_by('author')
    print(books)

我得到了数据库中的作者。 还有,

for book in book_set.iterator():
...     print(book.title)

我得到了所有书籍的清单。

我使用author_list = Author.objects.order_by("book").count(),它给出了作者的数量。 如何遍历数据库并获取作者的书籍数量和作者的书名。

【问题讨论】:

  • 你的问题是什么?
  • 我想要得到的是:作者和书籍数量,以及使用 for 循环编写的作者和书籍名称。请问我该怎么做?

标签: python django django-orm


【解决方案1】:

假设您想通过单次获取列出所有其他人的前 5 本书(按字母顺序排序)以及他们在一页上的总书数,您将需要使用 aggregations/annotations

Author.objects.annotate(
    book_count=Count('book'),
    book_list=ArrayAgg('book__title', ordering='book__title')
).order_by('name').all()

在您的模板中:

{% for author in author_list %}
    {author.name} ({author.book_count}):
    <ul>
    {% for book_title in author.book_list %}
        <li>{book_title}</li>
    {% endfor %}
    </ul>
{% endfor %}

这只是一个样本,未经测试。这只是为了让你开始。请查阅文档。它利用了 postgres 特有的ArrayAgg

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2020-01-27
    • 2021-07-25
    • 1970-01-01
    • 2021-10-02
    • 2018-06-21
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多