我正处于理解Django的最初阶段,并开始研究一个帮助我学习它的项目。在写一些模型时,我遇到了一个我想使用latest()的情况,但是可能有多个具有相同“最新”日期的对象。
在latest的Django文档中,它说
与get()类似,如果没有具有给定参数的对象,latest()会引发DoesNotExist。
但是,如果有多个具有相同“最新”日期的对象,那么latest()会怎么做?我怀疑它会像get()那样引发MultipleObjectsReturned,但由于文档中没有说明,我在这里问。我实际上希望它返回创建的最新对象,即具有最大主键的对象。如果它不这样做,那么正确的get()语句是什么,它将获得最新的日期,如果有多个,那么最大的主键是什么?
答案 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依赖于从数据库返回的内容。