В простом отношении ForeignKey я хочу запустить указанный код c при изменении одного из связанных объектов.
Здесь схема c code:
class Car(models.Model):
pass
class Wheel(models.Model):
car = models.ForeignKey('Car',
on_delete=models.CASCADE,
related_name='wheels',
null=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
my_custom_code()
Согласно документации django , обратный связанный метод менеджера .add
выполняет сохранение в базе данных, используя update()
вместо save()
по умолчанию. (то же самое для .remove, et c ...) Так что в приведенном ниже коде my_custom_code не вызывается при использовании .add
:
car = Car.objects.create()
wheel = Wheel.objects.create() # ok my_custom_code called here
car.wheels.add(wheel) # not called here because django use "update mechanism" which do not use save method
Нам нужно указать bulk=False
, чтобы добавить метод для принудительного использования метода save
.
car.wheels.add(wheel, bulk=False) # ok my_custom_code called here
Это проблема для меня, так как важно, чтобы my_custom_code вызывался при изменении любого из связанных объектов. Если кто-то забыл указать объем = Ложь, он создаст противоречивые данные.
Есть сигнал для этого случая? (например, сигнал m2m_changed). Есть способ принудительно задать объем = Ложь для всех методов отношения ForeignKey?
Спасибо за вашу помощь.
Зачем мне это нужно? Моя проблема X состоит в том, чтобы сохранить вычисленный результат в зависимости от связанных элементов в родительской записи. (и мне нужно, чтобы это значение всегда было актуальным) Моя первоначальная идея состояла в том, чтобы выполнять вычисления каждый раз, когда связанная модель модифицируется путем переопределения сохранения.