2017-01-24 14 views
2

У меня есть приложение Django, в котором у меня есть несколько проектов. Каждый проект может иметь несколько бюджетов, и каждый раз, когда в проект добавляется новый бюджет, существующие бюджеты для этого проекта должны иметь увеличенный на один version_number. «Текущий» бюджет должен быть бюджет которого version_number является 0- поэтому при попытке «получить» текущий бюджет для использования в других местах в коде, я делаю такие вещи, как:Python- как получить объект, у которого поле даты имеет самое последнее значение из списка объектов?

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

Однако, кажется, что-то , некоторые из проектов оказались с номером budgets, version_number - 0, поэтому кажется, что некоторые из проектов в базе данных, похоже, имеют несколько «текущих бюджетов» ...

Я знаю, что мне понадобится чтобы исправить логику того, как выполняется управление версиями, так что никакие два budgets не могут иметь то же самое version_number, но пока я просто хочу получить последние budget для каждого проекта в базе данных.

Budget Каждый объект имеет атрибуты, такие как: project_id, version_number, id, presentation_date и т.д.

Так что я теперь хочу, чтобы фильтровать budgets, которые были возвращены, когда я фильтруется version_number = 0) их presentation_date поле. Как я понимаю, я хотел бы сделать это с помощью min(), но я не могу показаться, чтобы получить эту работу ...

Я попытался следующий принятый ответ на: Find oldest/youngest datetime object in a list и побежал следующее в оболочке:

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

Но я получил TypeError, в котором говорилось:

TypeError: 'instancemethod' object is not iterable

Почему это? Как я могу искать в списке Budgets в заданном Project, для значения с последним значением presentation_date?

+0

Вам понадобится дополнительная информация. Что такое 'бюджеты' и' budgetgets.dates' здесь? И почему вы не можете использовать db для заказа этого запроса? –

ответ

4

Вы можете фильтровать по Date[Time]Fields с __lt[e], __gt[e] и date[time] объектов. Затем используйте 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, это поднимет ObjectDoesNotExist если QuerySet пуст.

+0

Эй, спасибо за ваш ответ. Я получаю сообщение об ошибке «DoNotExist», как вы уже сказали, но я не уверен, почему ...? Почему запрос будет пустым? Если я запускаю: 'testPrjBdgtsv0 = testPrjBdgts.filter (version_number = 0)', а затем 'testPrjBdgtsv0', я получаю следующий вывод:' [<Бюджет: Тест 1: Версия 0>, <Бюджет: Тест 1: Версия 0> , ...] 'так ясно, что запрос не пуст ...? – someone2088

+0

Тогда это не должно вызывать исключения. Вы уверены, что звоните по одному и тому же запросу? Qs в моем примере содержит еще несколько фильтров. – schwobaseggl

+0

Я печатаю его точно так же, как вы его написали в своем ответе, но есть что-то необычное, когда я набираю его: после ввода '__lte =' курсор возвращается к началу строки, так что Я продолжаю набирать 'now)', то есть все переписывают то, что было написано в начале строки ... – someone2088

 Смежные вопросы

  • Нет связанных вопросов^_^