在Django中,当有多个可能的结果时,最新的('date')会返回什么?

时间:2012-12-12 21:13:46

标签: django

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

latest的Django文档中,它说

  

与get()类似,如果没有具有给定参数的对象,latest()会引发DoesNotExist。

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

1 个答案:

答案 0 :(得分:4)

根据QuerySet.latest() method source code,情况并非如此 - latest()不会引发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()但是,as visible in its source code只有在结果数量不同于MultipleObjectsReturned(实际返回此结果时)且不同于{{1}时才会引发1 (当它引发0)时。

虽然DoesNotExist会返回latest()的结果,但get()适用于不超过1个元素的内容,您无需担心该角落的情况。希望它足够清楚。

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