Python django-last()和first()返回相同的对象
我在queryset中有两个对象,按创建日期排序。我正试图从中获得第一个和最后一个元素:Python django-last()和first()返回相同的对象,python,django,Python,Django,我在queryset中有两个对象,按创建日期排序。我正试图从中获得第一个和最后一个元素: ordered = self.get_queryset().order_by('created') print(ordered) print(ordered.first(), ordered.last()) 运行代码时,这是输出: <QuerySet [<Item: itemone>, <Item: itemtwo>]> itemone itemone 项目一项目一
ordered = self.get_queryset().order_by('created')
print(ordered)
print(ordered.first(), ordered.last())
运行代码时,这是输出:
<QuerySet [<Item: itemone>, <Item: itemtwo>]>
itemone itemone
项目一项目一
显然有两个物体,但出于某种原因,它给了我相同的一个
顺便说一句:我正在使用SQLite3
谢谢 我在使用Django 3、
CreateView
class-based和模型类meta上的ordering属性时偶然发现了相同的问题。我不知道为什么会发生这种情况,但是order\u by
方法解决了这个问题
#仅用于最后使用的澄清()
GoodModel.objects.order_by().last()
编辑:
显然,该模型没有任何显式的排序属性,那么first as last:)如果您尝试分页,您将得到更清晰的警告消息。
有很多方法可以告诉Django model如何处理订单,例如:
class UsefulModel(models.Model):
class Meta:
ordering='-created' # for example
希望现在更清楚@Raoul 我对一些模拟对象也有同样的问题-结果是我在“创建”时间戳上排序,但由于所有对象的时间戳都完全相同,first()和last()总是返回相同的对象 这是一个功能,不是一个bug: 通过给每个“已创建”字段一个唯一的时间戳修复此场景中的问题
一般来说,请确保您所排序的值是唯一的。其中一个值是否创建了
isNULL
?能否提供这两个对象的(相关)数据?我认为至少创建的列在这里很有趣。不,时间戳在它们两个上都存在。哦,我想我已经发现了错误。问题是它们有完全相同的时间戳…而不是其本身,因为请注意,.first()
和.last()
是两个查询,在出现平局时,数据库不需要对项目进行排序。除了按创建的排序外,元素还可以随机显示。如果一行已经在内存中,那么返回该行比执行更昂贵的磁盘操作更有效。这正是OhMad所做的。这是无效的错误!