1

質問があります。これら 2 つのプロパティの動作は異なりますか。また、どのように動作するのでしょうか。つまり、データベース ヒットです。ForeignKeyたとえば、フィールドを持つ記事のモデルがあります。book

from django.db import models

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

確率の 1 つを取得するための最良の方法は何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
4

3 に答える 3

2

でプロパティを定義しているためArticle、実際のデータベース ヒットはクエリArticleセットの取得方法によって異なります。オブジェクトの取得中にクエリセットで使用する場合select_related([depth=2])、プロパティの記述方法に関係なく、データベース ヒットの点で最適です。あなたがリストした両方の方法は、同様のパフォーマンスを持っています。Article

于 2012-10-01T11:05:52.733 に答える
0

データベースに対してクエリを1つだけ実行するため、このオプションをお勧めします。

@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 に答える
0

あなたはちょうど電話する必要があります

article.book.author

この呼び出しは book オブジェクトをクエリし、それを article インスタンスにキャッシュします。そのため、最初の呼び出しの後に article.book.id を呼び出すと、2 番目のクエリは実行されません。

個人的には、モデル メソッドでデータベースにヒットしないようにする必要があると思います。アプリケーションが複雑になると、開発者は本のモデルを手にしていても、記事の author メソッドを呼び出すだけになるからです。2つのプロパティは実質的に同じだからです。

于 2012-10-01T11:03:50.553 に答える