Получить первые записи базы данных mysql, которые суммируются с определенным значением - PullRequest
1 голос
/ 13 марта 2012

У меня есть модель Django, которая содержит задачи с оценкой времени, которое потребуется для выполнения каждой из них:

class Action(models.Model):
    name = models.CharField("Action Name", max_length=200, unique = True)
    complete = models.BooleanField(default=False, verbose_name="Complete?")
    creation_date = models.DateTimeField("Creation Date", default=datetime.now)
    time_estimate = models.IntegerField("Estimated Completion Time", choices = TIME_ESTIMATES, default = 15)

Я хочу выполнить запрос по всем незавершенным действиям, заказанным creation_date, чтобы получить действия, сумма которых time_estimate не превышает определенную сумму.

Допустим, у меня есть 5 действий:

Name: Action 1
time_estimate: 10

Name: Action 2
time_estimate: 20

Name: Action 3
time_estimate: 30

Name: Action 4
time_estimate: 40

Name: Action 5
time_estimate: 50

Предполагая, что они отсортированы в таком порядке, и я получаю время 55 минут, я хочу, чтобы фильтр возвращал Действия 1 и 2. Если бы у меня было 100 минут, я бы хотел, чтобы фильтр возвращал Действия 1, 2, 3 и 4.

Можно ли это сделать?

1 Ответ

0 голосов
/ 13 марта 2012

Вероятно, есть более элегантный способ, но я бы, скорее всего, сделал бы цикл, суммирующий общее количество раз, пока он не превысил значение:

time_allowed = 55
time_used = 0
actions = []

for a in Action.objects.filter(complete=False).order_by('creation_date'):
    if time_used + a.time_estimate <= time_allowed:
        time_used += a.time_estimate
        actions.append(a)

# actions is a list of actions which can be accomplished within the
# time_allowed threshhold, and you can loop them to display, or whatever you
# are trying to do with them.

Если вы хотите сделать его более масштабируемым, вы можете упорядочить по time_estimate(ASC) и добавьте оператор else, чтобы разорвать цикл for при превышении time_allowed.Как это:

time_allowed = 55
time_used = 0
actions = []

for a in Action.objects.filter(complete=False).order_by('time_estimate', 'creation_date'):
    if time_used + a.time_estimate <= time_allowed:
        time_used += a.time_estimate
        actions.append(a)
    else:
        break
...