Итак, у меня есть модель Person, а затем у меня есть название модели Carusage.Соответствующая часть Carusage такова:
class Carusage(models.Model):
person = models.ForeignKey(Person)
start = models.DateTimeField()
end = models.DateTimeField(null=True, blank=True)
Человек может взять машину, а затем система создает новый экземпляр Carusage и сохраняет его при запуске в качестве текущего времени.Затем, когда человек возвращает автомобиль, текущее время сохраняется до конца.
Теперь в моем коде у меня есть список моделей людей, и я хочу получить самую новую дату в Carusage для каждого человека.Так что, если Человек только что вернул машину, я бы хотел, чтобы конечное поле новейшего Карусели было связано с этим человеком, и, если у Человека все еще есть машина, я хотел бы, чтобы начальное поле.
Предпочтительно яЯ хотел бы сделать это в одном SQL-операторе, так как мой Person-list может вырасти довольно большим (нижние границы ~ 10, верхние границы ~ 10.000).Я попробовал что-то вроде этого:
Carusage.objects.filter(person__in(person_list)).exclude(start__gte(time_now))
И тогда думал о комментировании, но не мог придумать, как мне поступить.
Так что в настоящее время я делаю это:
time_now = datetime.datetime.now()
time_list = []
for p in person_list:
latest = Carusage.objects.filter(person=p).exclude(start__gte=time_now).only('start', 'end').latest('start')
try:
if latest.end<time_now:
time=latest.end
else:
raise
except:
time=latest.start
time_list.append(time)
Очевидно, мой код работает медленно (около 5 секунд для списка из 500 человек).Каков будет «способ django» для выполнения этих / этих запросов?Две вещи, которых я хотел бы достичь: только один раз попасть в базу данных для Carusage (по крайней мере, не в len (person_list) раз) и получить только соответствующее время из базы данных (нужно только самое новое время ...).Есть ли способ добиться этого?