2016-06-19 5 views
0

私はDjangoプロジェクトでは交換可能に以下の二つを使用してきた:等価ジャンゴのクエリセットのろ過

Comments.objects.filter(writer=self.request.user).latest('id')

Comments.objects.get(writer=self.request.user)

は、彼らが実際には同等か? docsは明示的にこれに対処していないようです。

+0

どちらも同じ結果が得られますが、フィルタはクエリセットを取得するために使用される唯一のデータベースのレコードと場所がある場合に使用され得ます。条件が失敗するとgetを使用すると、 .DoesNotExist例外が発生します。ここで、フィルタとしてエラーが発生しない場合は空のQuerysetが返されます。 – MicroPyramid

答えて

0

これはまったく同等ではありませんが、これは特定のモデルに大きく依存します。私たちはあなたのモデルCommentsの詳細を知らないが、我々が想定した場合、そのフィールドのライターがユニークではありません。

最初の文の場合:本質的には

Comments.objects.filter(writer=self.request.user).latest('id') 

戻り値の最大を持つオブジェクト特定の作家とのすべてのコメントのquerysetの間のid。 django.db.connections['default'].queriesを見ると、結果のクエリはSELECT .. ORDER_BY .. LIMIT ..となります。第二の文については

Comments.objects.get(writer=self.request.user) 

は、その作家FOT特定のレコードを返します。複数ある場合は、MultipleObjectsReturned例外が発生します。オブジェクトが見つからない場合は、DoesNotExist例外が発生します。これがユニークなフィールドである場合や、偶然に単一のオブジェクトが存在する場合、結果のクエリはより速いSELECT .. WHEREステートメントになります。

ドキュメントについては、Options.get_latest_byの参考資料を参照すると、latest機能の目的に関する詳細が記載されています。 Djangoが提供する利便性についてもっと考えてみてください。それにもかかわらず、Djangoがクエリとその結果のSQLをどのように評価するかを理解することは非常に重要であり、同じクエリを達成するための多くの方法があります。

0

私はなぜこれらが同等であると思われるのか、またはドキュメントがこれを具体的に扱うべきかわかりません。

コメントが1つしかない場合は、同じ結果が得られます。しかし、最初のバージョンではidの追加された並べ替えを使って、より複雑なクエリを介してそれを行います。

ライターのコメントが複数ある場合 - おそらくそうですが、2番目のバージョンでは常にMultipleObjectsReturnedエラーが発生します。

0

filterは、フィルタに対応するすべての行を示します。

latestが最新ライン(最高id値)例えば

います:

Comments.objects.filter(writer=self.request.user).latest('id')が最初の場所で取得self.request.user、その後latestによって書かれたすべてのCommentsは彼らから最新を取得します。

Comments.objects.get(writer=self.request.user)self.request.userによって書かれたコメントを与える:

getはそう、ユニークな行を取得するために行われます。 1つしかないはずです。ユーザーが多くのコメントを書くことができる場合は、filterまたはおそらくallを使用する必要があります。それは正確に何を望むかによって異なります。

詳細情報here