我有两个非常简单的模型:
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。问题是,书籍表是巨大的,有些作者有数以千计的书籍,因此获得精确计数是浪费处理。我只想知道是否有一个人在那里。
有没有办法用较少的处理来做到这一点?
答案 0 :(得分:2)
您可以尝试获取第一个元素:
def hasBooks(self):
return len(self.books.all()[:1]) == 1
肯定会注意检索所有元素,但只检索一个actor的第一本书(切片暗示SQL查询中的LIMIT 1)。
您还可以使用有用的exists()函数:
def hasBooks(self):
return self.books.exists()
答案 1 :(得分:0)
为什么不两者兼而有之? :)
def has_books(self):
return self.books.count() or False
Python将0
(或[]
,或{}
或None
评估为False
。因此,当计数返回0
时,逻辑表达式的计算结果为0
或False
= False
- 这恰好是您希望代码执行的操作!整洁的部分是,当count
非零时,函数仍然会返回一个整数!
您可以在代码中使用它,如下所示:
a = Author.objects.get(pk=1827)
if not a.has_books():
num_books = a.has_books()
优点(正如我所看到的)是你从同一个数据库调用中获得更多,并可能为自己节省不必要的额外数据调用。