Django: обновить запись перед сохранением - PullRequest
0 голосов
/ 28 апреля 2020
Model:

class Tester:
    test = models.ForeignKey(Platform)
    count = models.Integer()
    status = models.CharField(max_length=1, default='A')

Мне нужно менять статус на 'D' каждый раз, когда я вставляю новую запись для того же теста.

Я пытался использовать сигналы pre_save, но эта функция перешла в oop. Буду очень признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Функция сигнала, вероятно, переходит в бесконечное l oop, потому что вы сохраняете экземпляры той же модели в этой функции, по очереди каждый из которых запускает саму функцию сигнала. С небольшой осторожностью вы можете предотвратить это:

from django.db.models.signals import pre_save

@receiver(pre_save, sender=Tester)
def tester_pre_save(sender, instance, **kwargs):
    if not instance.pk:
        # This means that a new record is being created. We need this check as you want to do the operation when a new entry is **inserted** into table
        Tester.objects.filter(test=instance.test).update(status='D')

или, с помощью сигнала post_save:

from django.db.models.signals import post_save

@receiver(post_save, sender=Tester)
def tester_post_save(sender, instance, created, **kwargs):
    if created:
        # This means that a new record has been created. We need this check as you want to do the operation when a new entry is **inserted** into table
        Tester.objects.filter(test=instance.test).update(status='D')

Важными моментами здесь являются. так как мы используем update метода набора запросов для обновления существующих записей, они не будут вызывать сигналы, потому что они не используют метод сохранения модели, поэтому метод сигнала не будет запущен для других экземпляры мы обновляем здесь. И даже если бы он был запущен, так как мы выполняем операцию обновления при проверке состояния (если создается новый экземпляр), методы сигнала для этих других сохранений не будут ничего делать, следовательно, они не вызовут бесконечное oop.

1 голос
/ 28 апреля 2020

Переопределите метод сохранения нашего класса Tester:

def save(self, *args, **kwargs):
    if Tester.objects.filter(test=self.test).count()>0:
        self.status="D"
    else:
        self.status="A"
    super(Model, self).save(*args, **kwargs)

Поместите это в определение класса Tester.

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