Изменения Django, внесенные в поле ManyToMany по сигналам через меню администратора, не сохраняются - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующие модели:

class Case(models.Model):
title = models.CharField(verbose_name="Titre", max_length=1000)
statement = models.CharField(verbose_name="Énoncé du problême", max_length=1000)

class GivenCase(models.Model):
given_case = models.ForeignKey(Case, on_delete=models.CASCADE)
title = models.CharField(verbose_name="Titre", max_length=1000, null=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

class Candidate(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
cases = models.ManyToManyField(GivenCase, verbose_name="Cas", related_name="cases", blank=True)
assigned_cases = models.ManyToManyField(Case, verbose_name="Cas assignés", related_name="assigned_cases")

Проще говоря, у меня есть Кандидаты, которые могут иметь несколько Случаев, каждый раз, когда Случай назначается Кандидату, сигнал обрабатывается, а GivenCase создается и назначается Кандидату.

Вот мой обработчик сигнала:

    @receiver(models.signals.post_save, sender=Candidate)
def generate_exercise_for_new_user(sender, instance, **kwargs):
    cases = Case.objects.all()
    assigned_cases = GivenCase.objects.filter(user=instance.user).values_list("title", flat=True)
    for case in cases:
            if case.title not in assigned_cases:
                new_case = GivenCase(title=case.title, given_case=case, user=instance.user)
                new_case.save()
                instance.cases.add(new_case)
                if new_case in instance.cases.all():
                    print("ITS HERE")

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

Кажется, что это не дает сбоя, похоже, что все изменения стираются после окончания обработчика сигнала, у кого-нибудь есть идеи?

...