У меня есть модель (PurchaseOrder — сокращенно PO), содержащая временной бюджет. Пользователи могут добавлять записи часов в этот бюджет, где каждая запись часов уменьшает оставшийся бюджет.
Я реализовал сигналы для обновления остатка бюджета. После добавления часовой записи бюджет соответственно уменьшается. Поскольку вычисление потенциально требует много времени, я использовал для этой задачи поток.
def update_po_remaining_value(sender, instance, **kwargs):
CalculatePOThread(sender, instance).start()
post_save.connect(update_po_remaining_value, sender=HourRecord)
post_delete.connect(update_po_remaining_value, sender=HourRecord)
Поток CalculatePOThread вычисляет оставшееся значение бюджета PO, получая набор часовых записей и вычитая общий часовой набор записей из бюджета.
hr_set = HourRecord.objects.filter(purchase_order = po)
В моем dev.workspace это работает отлично. В рабочей среде соединение post_save также работает нормально, но у меня возникла странная проблема с сигналом post_delete. Довольно часто бывает так, что сумма часовых записей, возвращаемая запросом HourRecord.objects.filter(purchase_order = po), по-прежнему включает удаленную часовую запись, которая инициировала поток CalculatePOThread.
Во всяком случае, я обошел это поведение, добавив в поток 6-секундную задержку перед выполнением запроса. время сна (6).
Кто-нибудь знает, почему может возникнуть такая ситуация? похоже, что сигнал post_delete срабатывает до того, как запись действительно удаляется из базы данных..!? Но это будет ошибка в Django, и это будет мое последнее предположение.