python 计数与Django的多对多关系中的辅助表上的所有记录

dpiehjr4  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(113)

如何计算index.html中与每本书关联的读者总数?在index.html中,第一个循环遍历reader并提供与每个reader关联的图书数量的总和。第二个循环不计算读者已阅读的图书数量(我理解原因)。
我正在尝试计算与每本书关联的读者总数。是否有方法在index.html中完成此任务?或者应该在www.example.com中完成此views.py??或者应该在www.example.com中设置不同的关系models.py?
我一直在谷歌搜索,但没有找到答案。
models.py

class Book(models.Model):
    title = models.CharField(max_length=100)

class Reader(models.Model):
    name = models.CharField(max_length=100)
    book_read = models.ManyToManyField(Book)

views.py

def index(request):
    all_readers = Reader.objects.all()
    all_books = Book.objects.all()

    context = {
        "all_readers": all_readers,
        "all_books": all_books,
    }
    return render(request, "testing/index.html", context)

index.html

{% for reader in all_readers %}
    <h3>{{ reader.book.all.count }}</h3>
{% endfor %}

{% for book in all_books %}
    <h3>{{ book.reader.all.count }}</h3>
{% endfor %}
nbnkbykc

nbnkbykc1#

要计算index.html中每本书的读者总数,可以使用Django ORM中的Count函数来获取每本书的读者数量。
下面是如何在模板中执行此操作的示例:

{% for book in all_books %}
<h3>{{ book.reader_set.all.count }}</h3>
{% endfor %}

这将显示与每本书相关联的阅读器数量。
或者,也可以使用view函数中的annotate方法向每个book对象添加num_readers字段,然后可以使用**{{ book.num_readers }}**语法在模板中显示该字段:

浏览次数.py:

def index(request):
    all_readers = Reader.objects.all()
    all_books = Book.objects.all().annotate(num_readers=Count('reader'))
    context = {
        "all_readers": all_readers,
        "all_books": all_books,
    }
    return render(request, "testing/index.html", context)

index.html:

{% for book in all_books %}
<h3>{{ book.num_readers }}</h3>
{% endfor %}

这还将显示与每本书关联的读者数量。
一般建议尽量在view函数中进行数据处理,并将处理后的数据传递给模板,而不是尝试在模板本身进行数据处理,这样有助于保持模板代码简洁易懂,也便于调试可能出现的任何问题。

相关问题