Динамический столбец 'Order', основанный на 'Datetime_submitted', не обновляется при обновлении 'Datetime_submitted'
Я создаю систему управления очередью, в которой посетители могут лично записаться на подачу заявления на получение паспорта, а сотрудники могут видеть очередь людей, основанную на времени подачи их анкет. Код в моем model.py работает для всех сценариев, которые я пробовал (новые заявки, неявки, отмены и т.д.), за исключением случая, когда сотрудники изменяют время подачи формы, чтобы изменить порядок. Когда это происходит, номер заказа изменяется для измененной строки, но не для других строк. Однако все, что мне нужно сделать, чтобы обновить порядок в остальных строках, это открыть строку и нажать "сохранить", после чего все строки обновляются.
Это очень незначительная проблема, и я мог бы просто запретить изменение фейла 'datetime_submitted'. Однако, это мой первый проект Django, поэтому я хотел бы знать, почему колонка 'order' не обновляется при изменении 'datetime_submitted'. Заранее прошу прощения, так как я тоже впервые задаю вопрос.
Я просто включаю свой файл model.py, потому что формы и прочее не имеют значения, и все редактирование и тестирование в настоящее время осуществляется через логин администратора Django.
model.py
Нашел ответ на всякий случай, если кому-то интересно или это поможет бедняге в будущем.
for i in active:
#if it's added and it's time is greater than i's time add one to it's order number
if i.datetime_submitted < self.datetime_submitted:
curOrder = curOrder + 1
#THIS LINE BELOW IS ALL I ADDED.....
Patron.objects.filter(id=i.id).update(order = nextOrder)
nextOrder = nextOrder + 1
Вызов БД внутри цикла forloop, вероятно, создаст гораздо больше запросов, чем вам нужно. Кроме того, вы выполняете Patron.objects.filter(id=i.id).update(...)
в цикле i
, но .update()
можно использовать для ряда объектов внутри набора запросов. Если вы объедините .update()
с объектом F()
, то сможете обновлять каждое поле без необходимости перебора каждого объекта.
Похоже, что в вашем цикле for происходит какой-то сложный процесс сортировки, который я не до конца понял. Я думаю, вам нужно просто отфильтровать объекты, которые существуют до даты текущего заказа, они могут оставаться неизменными. Возьмите самый последний из них и добавьте 1 к номеру заказа - это станет нашим новым номером заказа для текущего объекта. Для всех объектов, которые существуют после этого, мы хотим использовать F()
для обновления номера заказа и добавить 1 к каждому.
def getOrder(self):
# get the Patron object immediately before this one
last_active = Patron.objects.filter(
active=True,
datetime_submitted__lt=self.datetime_submitted
).order_by('-datetime_submitted').first()
# update the current Patron's order number based on this one
self.order = last_active.order + 1
self.save()
# filter all Patrons after this one and add 1 to it's order number
Patron.objects.filter(
active=True,
datetime_submitted__gte=self.datetime_submitted
).exclude(
id=self.id
).update(order=F('order')+1)