8

私が持っているとしましょう:

class Library(models.Model):
    name = models.CharField(max_length = 100)

class Books(models.Model):
    library = models.ForeignKey(Library)
    book = models.CharField(max_length = 100)

新しいを作成したいのですが、ライブラリに's idだけを入力Booksできることはわかっていますが、のインスタンスを使用することもできます。私の質問は、IDを提供するだけの方が良いですか?インスタンスを使用したい場合は、を使用して評価する必要がありますが、データベースにヒットしますか?BooksLibraryLibrary.get()

追加の質問:ドキュメントから、クエリセットは怠惰であり、評価されるまでデータベースにヒットしません。クエリセットはいつ評価されますか?

4

1 に答える 1

13

はい、.get()すぐに評価されます。IDを使用すると、データベースクエリを確実に回避できます。

getQuerySetを返さないため、怠惰ではありません。モデルの単一のインスタンスを返します。QuerySetは、などから取得さ.filter()れるため、たとえば、すぐに評価Library.objects.filter(id=5)される間、遅延評価されます。Library.objects.get(id=5)

QuerySetの実際の評価については、ドキュメントで説明されています。基本的に、QuerySetから実際に値を引き出すと、評価されます。完全なリストは次のとおりです。

  • 反復
  • スライス
  • 漬物
  • repr()
  • len()
  • list()
  • bool()
于 2012-11-16T23:39:10.610 に答える