当前位置: 首页 > 编程笔记 >

Django 减少对ForeignKey字段的查询数量(n + 1个问题)

佟寒
2023-03-14
本文向大家介绍Django 减少对ForeignKey字段的查询数量(n + 1个问题),包括了Django 减少对ForeignKey字段的查询数量(n + 1个问题)的使用技巧和注意事项,需要的朋友参考一下

示例

问题

Django查询集以惰性方式求值。例如:

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

class Book(models.Model):
    author = models.ForeignKey(Author, related_name='books')
    title = models.CharField(max_length=100)
 
# views.py
def myview(request):
    # Query the database
    books = Book.objects.all()

    for book in books:
        # Query the database on each iteration to get author (len(books) times)
        # if there is 100 books, there will have 100 queries plus the initial query
        book.author
        # ...

    # total : 101 queries

上面的代码使django在数据库中查询每本书的作者。这样效率低下,最好只包含一个查询。

使用select_related上ForeignKey,如果你知道你将需要以后访问一个ForeignKey领域。

# views.py
def myview(request):
    # Query the database.
    books = Books.objects.select_related('author').all()
    
    for book in books:
        # Does not query the database again, since `author` is pre-populated
        book.author
        # ...

    # total : 1 query

select_related 也可以用于查找字段:

# models.py:
class AuthorProfile(models.Model):
    city = models.CharField(max_length=100)

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

class Book(models.Model):
    author = models.ForeignKey(Author, related_name='books')
    title = models.CharField(max_length=100)
# views.py
def myview(request):
    books = Book.objects.select_related('author')\
                        .select_related('author__profile').all()
   
    for book in books:
        # Does not query database
        book.author.name
        # or
        book.author.profile.city
        # ...

    # total : 1 query
           

 类似资料:
  • 本文向大家介绍Django 减少对ManyToManyField的查询数量(n + 1个问题),包括了Django 减少对ManyToManyField的查询数量(n + 1个问题)的使用技巧和注意事项,需要的朋友参考一下 示例 问题 解 使用prefetch_related上ManyToManyField,如果你知道你需要访问后场是一个ManyToManyField场。 prefetch_rel

  • 我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?

  • 问题内容: 我有以下模型: 我想在管理员中添加时过滤字段,如下所示: 我已经尝试了很多东西,但是没有任何效果!我怎样才能做到这一点? 问题答案: 使用方法:

  • 问题内容: 我有一个模型和,就像这样: 现在我有了一些和对象,我想得到一个查询,该查询选择所有指向少于2的对象。 A就像一个池子,用户(B)加入池。如果仅加入1或0,则根本不应该显示该池。 这样的模型设计可能吗?还是我应该修改一下? 问题答案: 听起来像是一份工作。 如果B计数通常是您需要的过滤或排序标准,或者需要显示在列表视图中,则可以考虑通过将b_count字段添加到A模型并在添加B或添加B时

  • 问题内容: 我只想知道如何从$ row [posts_remaining]中出现的数字中减去1 换一种说法… 这将给我我的结果,其中row posts_remaining = {THE NUMBER} 但是我想通过从中减去一个数字,然后在旧数字所在的位置设置新数字来更新返回的数字。 我希望我不要让这个令人困惑。很难解释。 另外…为了进行此操作,我是否应该将行“ posts_remaining”设置

  • 问题内容: 这可能无关紧要,只是想问一下, 如果一个对象从视图传递到模板,并且在模板中我将能够查询许多字段 型号代码: 观看次数: 在模板中可以解码多对多字段,因为我们正在传递对象 谢谢.. 问题答案: 通常,您可以通过django模板系统中的路径来跟踪任何不带参数的属性或方法调用。 对于上面的视图代码,类似 应该做您期望的。 (我无法完全从代码示例中找出具体细节,但希望这会阐明您可以从模板中学到