【问题标题】:Python- how do I get the object whose date field has the most recent value from a list of objects?Python-如何从对象列表中获取日期字段具有最新值的对象?
【发布时间】:2017-06-09 05:59:58
【问题描述】:

我有一个 Django 应用程序,其中有许多项目。每个项目都可以有多个预算,每次向项目添加新预算时,该项目的现有预算都应将其version_number 加一。 “当前”预算应该是 version_number 为 0 的预算,因此当尝试“获取”当前预算以在代码中的其他地方使用时,我正在执行以下操作:

budgetInstance = Budget.objects.get(project = project, version_number = 0)

但是,似乎不知何故,一些项目以budgets 的数量结束,version_number 为 0,因此数据库中的一些项目似乎有几个“当前预算” ...

我知道我需要修复版本控制的逻辑,以便没有两个budgets 可以拥有相同的version_number,但现在,我只想获取最新的budget对于数据库中的每个项目。

每个Budget 对象都具有以下属性:project_idversion_numberidpresentation_date 等。

所以我现在想通过presentation_date 字段过滤version_number = 0) 时返回的budgets。据我了解,我会使用 min() 来执行此操作,但我似乎无法使其正常工作...

我尝试按照接受的答案:Find oldest/youngest datetime object in a list,并在 shell 中运行以下内容:

mostRecentBudget = min(date for date in budgets.dates if date < now)

但我收到了TypeError,上面写着:

TypeError: 'instancemethod' 对象不可迭代

这是为什么?如何在给定的Project 中搜索Budgets 列表,以查找具有最新presentation_date 字段值的列表?

【问题讨论】:

  • 您需要提供更多信息。 budgetsbudgets.dates 这里是什么?为什么不能使用 db 来订购这个查询?

标签: python django filter get iterable


【解决方案1】:

您可以使用__lt[e], __gt[e]date[time] 对象过滤Date[Time]Fields。然后,使用latest(field_name)

from django.utils import timezone

now = timezone.datetime.now()
Budget.objects.filter(
    project=project, version_number=0, 
    presentation_date__lte=now  # p_d less than or equal now
).latest('presentation_date')

last 不同,但与get 非常相似,如果QuerySet 为空,这将引发ObjectDoesNotExist

【讨论】:

  • 您好,谢谢您的回答。我收到DoesNotExist 错误消息,正如你提到的那样,我可能会收到,但我不确定为什么......?为什么查询集是空的?如果我运行:testPrjBdgtsv0 = testPrjBdgts.filter(version_number = 0),然后运行testPrjBdgtsv0,我会得到以下输出:[&lt;Budget: Test 1: Version 0&gt;, &lt;Budget: Test 1: Version 0&gt;, ... ] 那么显然查询集不为空...?
  • 那么它不应该引发异常。您确定在完全相同的查询集上调用 latest 吗?我的示例中的 qs 有几个过滤器。
  • 我输入的内容与您在答案中所写的完全一样,但是当我输入它时发生了一些不寻常的事情:输入__lte= 后,光标移回开头行,所以当我继续输入now)时,这一切都覆盖了行首写的内容......
  • 它实际上似乎真的搞砸了shell中的输入......当我开始在那一行输入时,提示说:now[58],而不是In [57]:前一个输入行...以及之后的每一行(如果我按 Enter 键)只有 ... : 我不确定这是为什么?
  • @someone2088 ctrl + c 是你在 shell 中的朋友。 ... 表示您正在输入的语句尚未完成
猜你喜欢
  • 2022-06-15
  • 2023-02-17
  • 1970-01-01
  • 2015-08-11
  • 2021-11-28
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多