1

我有个问题。这两个属性的工作方式是否不同以及如何,我的意思是 db hits。例如,我们有模型文章,它有一个ForeignKey字段book

from django.db import models

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

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

@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
4

3 回答 3

2

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

于 2012-10-01T11:05:52.733 回答
0

你应该打电话

article.book.author

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

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

于 2012-10-01T11:03:50.553 回答
0

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

@property
def author(self):
    authors = Author.objects.filter(book__article=self.id)[:1]
    return authors[0] if authors else None
于 2012-10-01T11:08:28.467 回答