2016-09-09 19 views
1

Djangoのドキュメントで最適化されているので、少し実験をしました。だから私はこれをしなかった:django querysetは本当に何をしていますか?

>>> x = Artist.objects.only('id').filter() 
>>> print x.query 
SELECT "store_artist"."id" FROM "store_artist" 

>>> y = Artist.objects.filter() 
>>> print y.query 
SELECT "store_artist"."id", "store_artist"."name", "store_artist"."birth_date" FROM "store_artist" 

私はクエリはしかし、私は、さらにテストをした変更されたことを確認できます。

>>> for _x in x: 
    ... _x.name 
    ... 
    u'Beyone' 
    u'Beyoneeee' 
    u'Beyone231231' 
    u'Beyone2222' 
    u'No Album' 

>>> for _y in y: 
    ... _y.name 
    ... 
    u'Beyone' 
    u'Beyoneeee' 
    u'Beyone231231' 
    u'Beyone2222' 
    u'No Album' 

だから、あなたはそれだけで同じ結果を持って気づいた場合。どうしてこうなりました?私は名前が表示されるか、または無効であるべきではないのでY変数に私はIDをフェッチすることを考えた。ここ

方法によって私のモデルである:

class Artist(EsIndexable, models.Model): 
    name = models.CharField(max_length=50) 
    birth_date = models.DateField() 

答えて

1

それだけであなたが与えるフィールドを照会んが、そのモデルのインスタンスを返します。したがって、別のフィールドを要求すると、名前を取得するために2番目のクエリを作成することになります。

+0

ああ、私のクエリは単なる1つではなく倍増しましたか? –

+0

この場合ははいですが、あなただけがあなたが他のフィールドを必要としていないと言っています – Sayse

+0

私はそれがどう起こったのか疑問に思っていた...それがもうフェッチされないとわかったとき –

1

.onlyメソッドは、追加できないクエリセットを返します。新しいクエリセットが必要な場合は、それを得るために。このメソッドは、非常に大きなデータセットを持ち、ビジネスロジック内のすべての処理のための唯一のフィールドが必要な場合に便利です。 あなたの場合、私はdefer()メソッドの使用を提案します。 defer()を複数回呼び出すことができます。各呼び出しは、新しいフィールドを遅延セットに追加します。今では、その中からあなたが使いたいと思っている値のセットの中であなたを理解しています。そして、あなたが必要とする主なものは、最適化とパフォーマンスを助ける値を取り出すためにデータベースに再度呼び出す必要があります。

+0

ええ、あなたは主に答えましたが、それでは含まれていないものを引き出す方法はありますか? –

関連する問題