gpt4 book ai didi

django - 统计Django中具有一定值的相关对象的个数

转载 作者:搜寻专家 更新时间:2023-10-30 21:58:06 26 4
gpt4 key购买 nike

这是演示我的问题的简化模型:

class User(models.Model):
username = models.CharField(max_length=30)
total_readers = models.IntegerField(default=0)

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

class Reader(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)

因此,我们有UsersBooksReaders(Users,他们阅读了)。因此,Reader 基本上是 BookUser 之间的多对多关系。

现在假设当前用户正在读书。现在,我想更新本书作者所有书籍的总读者数:

# get the book (as an example pk=1)
book = Book.objects.get(pk=1)

# save Reader object for this user and this book
Reader(user=request.user, book=book).save()

# count and save the total number of readers for this author in all his books
book.author.total_readers = Reader.objects.filter(book__author=book.author).count()
book.author.save()

通过这样做,Django 为 PostgreSQL 创建了一个 LEFT OUTER JOIN 查询,我们得到了预期的结果。但是数据库表很大,成为了瓶颈。

在此示例中,我们可以简单地将每个 View 的total_readers 增加一个,而不是实际计算数据库行数。然而,这只是一个简化的模型结构,我们不能在现实中这样做。

我能做的是在 Reader 模型中创建另一个名为 book_author_id 的字段。因此,我对数据进行了非规范化,并且可以对 Reader 对象进行计数,而无需 PostgreSQL 对 User 表进行 LEFT OUTER JOIN。最后,这是我的问题:是否可以创建某种数据库索引,以便 PostgreSQL 自动处理这种非规范化?或者我真的必须创建这个额外的模型字段并在其中冗余存储作者的 PK 吗?

编辑 - 指出基本问题:我得到了几个很好的答案,适用于很多场景。但是,它们并没有解决这个实际问题。我唯一想知道的是,是否有可能让 PostgreSQL 自动处理这种非规范化 - 例如通过创建某种数据库索引。

最佳答案

有时,这个查询可以提供更好的服务:

book.author.total_readers = Reader.objects.filter(book__in=Book.objects.filter(author=book.author)).count()

这将生成带子查询的查询,有时它会比带连接的查询具有更好的性能。您甚至更进一步,最终分别创建了 2 个查询:

book.author.total_readers = Reader.objects.filter(book_id__in=Book.objects.filter(author=book.author).values_list('id', flat=True)).count()

这将生成 2 个查询,一个将检索该作者的所有图书 ID 的列表,第二个将检索具有该列表中 ID 的图书的阅读计数。

关于django - 统计Django中具有一定值的相关对象的个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32902650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com