django和模特的财产

时间:2012-10-01 10:46:33

标签: python django

我有一个问题。这两个属性是否会有所不同,我的意思是db命中。 例如,我们有模型文章,其中包含ForeignKey字段book

from django.db import models

class Article(models.Model):
    book = models.ForeignKey("books.Book")

通过其中一个方法获得author的最佳方法是什么:

@property
def author(self):
    if self.book:
        return self.book.author
    return None

@property
def author(self):
    book = self.book
    if book:
        return book.author
    return None

3 个答案:

答案 0 :(得分:2)

由于您在Article上定义了一个属性,因此实际的数据库命中取决于检索Article查询集的方式。如果您在检索select_related([depth=2])对象时在queryset上使用Article,则无论您如何编写属性,这都是数据库命中率最佳的。您列出的两种方式都具有相似的性能。

答案 1 :(得分:0)

您应该致电

article.book.author

此调用将查询book对象并将其缓存在文章实例上。因此,如果您在第一次调用后调用article.book.id,则不会运行第二个查询。

Personaly我认为你应该尽量避免在模型方法中使用数据库。因为,当您的应用程序变得复杂时,即使他们手中还有书籍模型,开发人员也只会调用您文章的作者方法。因为两个属性几乎相同。

答案 2 :(得分:0)

我更喜欢这个选项,因为它只对数据库进行一次查询:

@property
def author(self):
    authors = Author.objects.filter(book__article=self.id)[:1]
    return authors[0] if authors else None