3

私は Django を理解する最初の段階にあり、それを学ぶのに役立つプロジェクトに取り組み始めました。いくつかのモデルを書いているときに、latest() を使用したい状況になりましたが、同じ「最新」の日付を持つオブジェクトが複数存在する可能性があります。

latestの Django ドキュメントには、次のように書かれています。

get() と同様に、指定されたパラメーターを持つオブジェクトが存在しない場合、latest() は DoesNotExist を発生させます。

しかし、同じ「最新」の日付を持つオブジェクトが複数ある場合、latest() はどうしますか? get() と同じようにMultipleObjectsReturnedが発生すると思われますが、これはドキュメントに記載されていないため、ここで質問しています。実際には、作成された最新のオブジェクト、つまり最大の主キーを持つオブジェクトが返されることを願っています。そうしないと、日付ごとに最新のものを取得し、複数ある場合は主キーごとに最大のものを取得する正しい get() ステートメントは何でしょうか?

4

1 に答える 1

4

QuerySet.latest()メソッドのソースコードによると、そうではありません-結果を1つの要素に制限するため、は発生latest()しません。MultipleObjectsReturned

def latest(self, field_name=None):
    """
    Returns the latest object, according to the model's 'get_latest_by'
    option or optional given field_name.
    """
    latest_by = field_name or self.model._meta.get_latest_by
    assert bool(latest_by), "latest() requires either a field_name parameter or 'get_latest_by' in the model"
    assert self.query.can_filter(), \
        "Cannot change a query once a slice has been taken."
    obj = self._clone()
    obj.query.set_limits(high=1)  # <-- see here
    obj.query.clear_ordering()
    obj.query.add_ordering('-%s' % latest_by)
    return obj.get()

get()ただし、ソースコードに表示されているようにMultipleObjectsReturned、結果の数が1(実際にこの結果を返す場合)とは異なり、 0(発生する場合)とは異なる場合にのみ発生しDoesNotExistます。

したがって、のlatest()結果を返しますがget()get()要素が1つしかないもので動作するため、そのコーナーケースについて心配する必要はありません。うまくいけば、それは十分に明確です。

この場合(2つ以上のレコードの最新の日付が同じ場合)、Djangoはデータベースから返されたものに依存していると思います。

于 2012-12-12T21:22:37.287 に答える