3

我正处于了解 Django 的最初阶段,并且已经开始着手一个项目来帮助我学习它。在编写一些模型时,我遇到了一种情况,我想使用 latest() 但可能有多个对象具有相同的“最新”日期。

最新的 Django 文档中,它说

与 get() 一样,如果没有具有给定参数的对象, latest() 将引发 DoesNotExist。

但是,如果有多个对象具有相同的“最新”日期,那么 latest() 会做什么?我怀疑它会像 get() 那样引发MultipleObjectsReturned,但由于文档中没有说明,我在这里问。我实际上希望它返回最新创建的对象,即具有最大主键的对象。如果它不这样做,那么正确的 get() 语句将获得最新的日期,如果有多个,那么按主键最大的语句是什么?

4

1 回答 1

4

根据QuerySet.latest()方法源代码,情况并非如此 -latest()不会 raise MultipleObjectsReturned,因为它将结果限制为 1 个元素:

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(当它 raise 时)时才会引发DoesNotExist

因此,尽管latest()返回 的结果get(),但get()可以在不超过 1 个元素的东西上工作,您无需担心这种极端情况。希望它足够清楚。

我相信在这种情况下(当两个或多个记录具有相同的最新日期时)Django 依赖于从数据库返回的内容。

于 2012-12-12T21:22:37.287 回答