0

我有两个模型:

  1. 类别 - 零或多本书可以属于一个类别
  2. Book - 一本书可以有零个或一个类别

如果我这样做,Book.objects.all()我会得到正常的东西,[book11, book10, book9, ...]但我不想要那样。我想要的是这样的:

[
 [book11, book2, book1],
 [book10],
 [book8, book6],
 [book7],
 [book4, book3],
 ...
]

在哪里

  • 书籍根据其类别进行分组。没有类别的书籍也将作为单个元素组包含在列表中
  • 排序将根据书籍的反向创建

为了更好地理解这里是我的模型结构:

class Category(models.Model):
    name = models.CharField(max_length=50)

class Book(models.Model):
    name = models.CharField(max_length=128)
    category = models.ForeignKey(Category, on_delete=models.CASCADE,related_name='books', null=True, blank=True)

4

1 回答 1

1

要在 Python 代码中进行此分组,您可以使用itertools.groupby

from itertools import groupby


qs = Book.objects.order_by('category', '-created_at')
grouped_books = groupby(qs, lambda book: book.category)
for category, books in grouped_books:
    print(category)
    print(list(books))

您也可以使用regroup标签在模板中执行此操作

在您看来,将此查询集传递给您的模板上下文

   books = Book.objects.order_by('category', '-created_at')

在您的模板中

{% regroup books by category as category_list %}

<ul>
{% for category in category_list %}
    <li>{{ category.grouper }}
    <ul>
        {% for book in category.list %}
          <li>{{ book }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
于 2022-02-28T09:49:09.297 回答