Я работаю над проектом, в котором мне нужно пересчитать значения, основываясь на том, изменились ли поля или нет.Вот пример:
Model1:
field_a = DatetimeField()
calculated_field_1 = ForeignKey(Model2)
Model2:
field_j = DatetimeField()
Если field_a изменяется на model1, я должен пересчитать значение для поля selected_field_1, чтобы увидеть, нужно ли его также изменить.Выполненные вычисления требуют, чтобы я запросил базу данных для проверки значений других моделей и затем определил, нужно ли изменить значение вычисляемого поля.
Пример) field_a изменится, тогда мне придется выполнить этот расчет
result = Model2.objects.filter(field_j__gte=Model1.field_a)
If result.exists():
Model1.field_a = result.first()
Model1.save(update_fields=(‘field_a’,))
Это самый простой пример, который я мог придумать, и запросы могут быть гораздо более сложными, чем эта.
Проект начался с одного вычисления, когда поле изменилось, поэтому я решил лучшийподход был использовать сигналы Джанго.Месяцы спустя требования к проекту изменились, и теперь мне пришлось выполнить несколько других вычислений, которые очень похожи на пример выше.Я заметил, что моя функция post_save выходит из-под контроля, и мне просто интересно, какие есть альтернативы использованию сигналов.Хотя вычисления post_save, которые я сейчас делаю, занимают гораздо меньше полсекунды, ради моего вопроса делают вид, что они заняли секунду или больше.
Действительный ответ не может включать в себя выполнение этих расчетов на лету, когда я извлекаю их из БД.Мы используем систему проверки, которая требует, чтобы я установил эти значения в модели, и запрос на лету был подходом, который мы пытались, но по причинам производительности он не был жизнеспособным.Кроме того, при смене поля одно из требований заключается в том, что пользователь должен видеть результаты вычисляемого поля, поэтому это должно происходить синхронно.
Какие существуют альтернативные подходы к использованию этого шаблона?