我有一个问题。这两个属性是否会有所不同,我的意思是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
答案 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