私にはモデルがあります:
_class MyModel(models.Model):
creation_date = models.DateTimeField(auto_now_add = True, editable=False)
class Meta:
get_latest_by = 'creation_date'
_
私のビューには次のようなクエリがありました。
_instances = MyModel.objects.all().order_by('creation_date')
_
その後、instances.latest()
が必要になりましたが、正しいインスタンスが得られず、実際には最初のインスタンスが得られました。 order_byを_-creation_date
_に設定したとき、または実際にクエリからorder_byを削除したときのみ、.latest()
が正しいインスタンスを与えました。これは、ビューではなくpython manage.py Shellを使用して手動でテストしたときにも発生します。
だから私が今やったことは、モデルのメタにあり、_order_by = ['creation_date']
_をリストしており、クエリでは使用していません。
.latest()
は、(date)(time)フィールドに基づいて常に最新のインスタンスを返すと予想していました。クエリで_order_by
_を使用すると、.latest()
が奇妙に動作するのが正しいかどうかを教えてもらえますか?
.latest()は、(date)(time)フィールドに基づいて常に最新のインスタンスを返すと予想していました。
ドキュメント は
モデルの
Meta
が_get_latest_by
_を指定している場合、latest()
への_field_name
_引数を省略できます。 Djangoは、デフォルトで_get_latest_by
_で指定されたフィールドを使用します。
つまり、MyModel.objects.latest()
を実行すると、日付/時刻フィールドに基づいて最新のインスタンスが取得されます。そして、サンプルデータを使用してコードをテストしたとき、実際にテストしました。
その後、instances.latest()が必要になりましたが、正しいインスタンスが得られず、実際には最初のインスタンスが得られました。
latest()
の動作方法を誤解しています。 MyModel.objectsで呼び出されると、tableの最新のインスタンスを返します。 querysetで呼び出された場合、latest
はthe querysetの最初のオブジェクトを返します。クエリセットは、MyModel
のすべてのインスタンスで構成され、_creation_date
_によって昇順で並べられています。このクエリセットのlatest
がfirst row of the querysetを返すのは当然です。これは、たまたまtableの最も古い行です。
理解を深める1つの方法は、latest
に対して起動されたクエリを表示することです。
事例1:
_from Django.db import connection
MyModel.objects.latest()
print connection.queries[-1]['sql']
_
これは印刷します:
_SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" DESC LIMIT 1
_
_creation_date DESC
_およびLIMIT
句による順序に注意してください。前者は_get_latest_by
_のおかげですが、後者はlatest
の貢献です。
次に、ケース2:
_MyModel.objects.order_by('creation_date').latest()
print connection.queries[-1]['sql']
_
プリント
_SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" ASC LIMIT 1
_
順序が_creation_date ASC
_に変更されていることに注意してください。これは、明示的な_order_by
_の結果です。 LIMIT
はerに付けられ、後でlatest
に提供されます。
ケース3:objects.latest()
に_field_name
_を明示的に指定する場合も参照してください。
_MyModel.objects.latest('id')
print connection.queries[-1]['sql']
_
ショー
_SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM "app_mymodel"
ORDER BY "app_mymodel"."id" DESC LIMIT 1
_
これは既知の Djangoのバグ で、1.3のリリース後に修正されたと思います。
これは私のために働いた
latestsetuplist = SetupTemplate.objects.order_by('-creationTime')[:10][::1]