Как надежно запускать пользовательский код при изменении связанных (ForeignKey) объектов - PullRequest
0 голосов
/ 07 января 2020

В простом отношении 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 состоит в том, чтобы сохранить вычисленный результат в зависимости от связанных элементов в родительской записи. (и мне нужно, чтобы это значение всегда было актуальным) Моя первоначальная идея состояла в том, чтобы выполнять вычисления каждый раз, когда связанная модель модифицируется путем переопределения сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...