在 Django 中使用过滤器获取最新记录
Posted
技术标签:
【中文标题】在 Django 中使用过滤器获取最新记录【英文标题】:Get the latest record with filter in Django 【发布时间】:2013-03-18 12:38:55 【问题描述】:我正在尝试获取最新的 Django 模型对象,但似乎无法成功。
这些都不起作用:
obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)
【问题讨论】:
你试过了吗:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
@catherine,工作就像一个魅力! :D。你想把这个写成答案让我检查一下吗?
2018 年NewsPostImage.objects.filter(newsPostTarget=img_id).first()
。希望对您有所帮助。
【参考方案1】:
查看来自 django 的文档: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest
你需要在 latest() 中指定一个字段。例如。
obj= Model.objects.filter(testfield=12).latest('testfield')
或者,如果您的模型的 Meta 指定 get_latest_by,您可以将 field_name
参数省略为 earliest() or latest()
。 Django 会默认使用get_latest_by
中指定的字段。
【讨论】:
“testfield”必须是日期字段吗?【参考方案2】:obj= Model.objects.filter(testfield=12).order_by('-id')[0]
【讨论】:
@DaveMerwin 这不是不正确的;有多种方法可以解决这个问题,这个答案和另一个答案都是正确的。 请注意,这假设 id 是一个有序的主键整数。这通常是 django 的默认设置,但有时不是。 这可能很危险,因为过滤器可能会返回一个空列表 '-id'用来倒序! 也许是 .first() 而不是 [0] ?【参考方案3】:last()latest()
最后一次签名():
ModelName.objects.last()
使用最新的():
ModelName.objects.latest('id')
【讨论】:
【参考方案4】:latest
真正设计用于处理日期字段(它可能也适用于其他全序类型,但不确定)。而在不指定字段名称的情况下使用它的唯一方法是设置get_latest_by
元属性,如here 所述。
【讨论】:
它确实适用于主键,你总是可以这样做:Model.objects.latest('id')
【参考方案5】:
obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
是正确的解决方案
【讨论】:
【参考方案6】:您可以在此处与此进行比较。
latest('created')
与 order_by('-created').first()
相同
如果我错了,请纠正我
【讨论】:
以上是关于在 Django 中使用过滤器获取最新记录的主要内容,如果未能解决你的问题,请参考以下文章
如何在python django中获取所有父节点但过滤子节点