1

我有两个非常简单的模型:

class Author(models.Model):
    name = models.CharField(max_length=255)

    def hasBooks(self):
        return self.books.count()

class Book(models.Model):
    title = models.ForeignKey(Author, related_name="books")

我想编写一个函数 hasBooks(如上所示),如果作者有相关的书,它只返回 true 或 false。我能想到的唯一方法是获取 count() 并在它大于 0 时返回 true,如果它是 0,则返回 false。问题在于书的表是巨大的,有些作者有数以千计的书籍,因此获得准确的计数是一种浪费。我只想知道是否有一个。

有没有办法使用更少的处理来做到这一点?

4

2 回答 2

3

您可以尝试获取第一个元素:

def hasBooks(self):
    return len(self.books.all()[:1]) == 1

当然,这会注意检索所有元素,但只检索演员的第一本书(切片意味着 SQL 查询中的 LIMIT 1)。

您还可以使用有用的 exists() 函数:

def hasBooks(self):
    return self.books.exists()
于 2013-08-22T22:15:54.380 回答
0

为什么不兼得?:)

def has_books(self):
    return self.books.count() or False

Python将0( or [], or {}or None, 就此而言) 评估为False. 因此,当计数返回时0,逻辑表达式的计算结果为0or False= False-- 这恰好是您希望代码执行的操作!整洁的部分是,当count非零时,该函数仍将返回一个整数!

您可能可以在代码中使用它,如下所示:

a = Author.objects.get(pk=1827)
if not a.has_books():
    num_books = a.has_books()

优点(如我所见)是您可以从同一个数据库调用中获得更多收益,并可能为自己节省对数据库的不必要的额外调用。

于 2013-08-23T09:13:48.353 回答