Django - 检查模型是否有孩子(相关型号)

时间:2013-08-22 22:06:10

标签: django python-2.7 django-models

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

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。问题是,书籍表是巨大的,有些作者有数以千计的书籍,因此获得精确计数是浪费处理。我只想知道是否有一个人在那里。

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

2 个答案:

答案 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时,逻辑表达式的计算结果为0False = False - 这恰好是您希望代码执行的操作!整洁的部分是,当count非零时,函数仍然会返回一个整数!

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

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

优点(正如我所看到的)是你从同一个数据库调用中获得更多,并可能为自己节省不必要的额外数据调用。