1

只是一个非关键问题在试图在文档中找到答案无济于事后困扰了我。

class Book(models.Model)
    authors = ManyToManyField(Author)

homer = Author.objects.get(pk=1)
iliad = Book.objects.get(pk=2)

iliad.authors.filter(pk=homer.pk).exists()
Book.objects.filter(name='Iliad', authors__in=homer).exists()

我相信最后两个断言将测试荷马是否是《伊利亚特》的作者。但我有点不喜欢 (pk=homer.pk) 部分,我想知道是否有任何构造可以让我测试一个对象(假设我们已经从“get”中获得它)是否存在于查询集中?

(homer in iliad.authors)

虽然上面的表达式也可以工作,并且可以说更pythonic,但它可能会从数据库中检索到不必要的太多作者。

4

2 回答 2

0

在这种特殊情况下homer in iliad.authors,只会比exists版本稍慢。大多数书籍都有一两个作者,因此从 DB 获取所有内容应该不是问题。

我认为如果不按照您使用的方式使用过滤器,那么在 Django 中无法更快地做到这一点,抱歉。

于 2012-07-27T19:31:18.737 回答
0

Django 的查询集代码在使用操作符时实现了一些优化in

为了获得更好的洞察力,我会尝试在查询集in上与您的其他示例对大数据集和小数据集的使用进行计时。

于 2012-07-27T19:34:43.597 回答