<blockquote>
<p>I would have expected .latest() to always return the most recent instance based on a (date)(time) field. </p>
</blockquote>
<p><a href="http://docs.djangoproject.com/en/dev/ref/models/querysets/#latest-field-name-none" rel="noreferrer">documentation</a>说</p>
<blockquote>
<p>If your model's <code>Meta</code> specifies <code>get_latest_by</code>, you can leave off the <code>field_name</code> argument to <code>latest()</code>. Django will use the field specified in <code>get_latest_by</code> by default.</p>
</blockquote>
<p>这意味着,当您启动<code>MyModel.objects.latest()</code>时,您将根据日期/时间字段获得最新的实例。当我使用示例数据测试您的代码时,它确实做到了。</p>
<blockquote>
<p>And then later I wanted instances.latest(), but it would not give me the correct instance, in fact it gave me the first instance.</p>
</blockquote>
<p>你误解了<code>latest()</code>的工作方式。当调用<em>MyModel.objects</em>时,它返回
<em>表中的最新实例。当对<em>queryset</em>调用时,<code>latest</code>将返回<em>queryset</em>中的第一个对象。您的queryset包含所有按<code>creation_date</code>升序排列的<code>MyModel</code>实例。只有这样,这个queryset上的<code>latest</code>才应该首先返回queryset</em>的<em>行<em>。这碰巧是<em>表</em>中最早的一行。</p>
<p>一种更好的理解方法是查看为<code>latest</code>激发的查询。</p>
<p>案例1:</p>
<pre><code>from django.db import connection
MyModel.objects.latest()
print connection.queries[-1]['sql']
</code></pre>
<p>这张照片:</p>
<pre><code>SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" DESC LIMIT 1
</code></pre>
<p>注意按<code>creation_date DESC</code>和<code>LIMIT</code>子句排序。前者是由于<code>get_latest_by</code>,后者是<code>latest</code>的贡献。</p>
<p>现在,案例2:</p>
<pre><code>MyModel.objects.order_by('creation_date').latest()
print connection.queries[-1]['sql']
</code></pre>
<p>印刷品</p>
<pre><code>SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM
"app_mymodel" ORDER BY "app_mymodel"."creation_date" ASC LIMIT 1
</code></pre>
<p>请注意,顺序已更改为<code>creation_date ASC</code>。这是显式<code>order_by</code>的结果。<code>LIMIT</code>是附加在er上的,稍后由<code>latest</code>提供。</p>
<p>让我们也看看第3种情况:您显式地为<code>objects.latest()</code>指定<code>field_name</code>。</p>
<pre><code>MyModel.objects.latest('id')
print connection.queries[-1]['sql']
</code></pre>
<p>显示</p>
<pre><code>SELECT "app_mymodel"."id", "app_mymodel"."creation_date" FROM "app_mymodel"
ORDER BY "app_mymodel"."id" DESC LIMIT 1
</code></pre>