Django Набор полей "многие ко многим" в методе сохранения модели

Я пытаюсь переопределить метод сохранения в модели с логикой обновления нескольких полей. Используя операторы печати, я вижу, что значения обновляются, как и ожидалось, но значения не сохраняются после сохранения.

В приведенной ниже модели флаг change_access_flag изменяется, как и ожидалось, с помощью сигнала, печати выполняются с соответствующими значениями, но поля allowed_departments и allowed_communities не обновляются с напечатанными значениями.

Модель

class Person(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    full_name = models.CharField(null=True, blank=True, max_length=50)
    payroll_id = models.CharField(null=True, max_length=20)
    position = models.ForeignKey(Position, null=True, on_delete=models.SET_NULL)
    primary_community = models.ForeignKey(Community, null=True, on_delete=models.CASCADE, related_name="primary_community")
    region = models.CharField(max_length=2, choices=RegionChoices.choices, blank=True, null=True)
    allowed_communities = models.ManyToManyField(Community, blank=True, related_name="allowed_community")
    allowed_departments = models.ManyToManyField(Department, blank=True)
    access_change_flag = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.user.first_name} {self.user.last_name}'

    class Meta:
        verbose_name_plural = "People"
        ordering = ['position__position_code', 'user__last_name', 'full_name']

    def save(self, *args, **kwargs):
        #Set Full Name field
        if self.user.last_name:
            self.full_name = f'{self.user.first_name} {self.user.last_name}'
        
        super().save(*args, **kwargs)

        #Change flag set in signals, set for events that require updating access settings
        if self.access_change_flag:
            self.access_change_flag = False

            #Allowed community access
            access_level = self.position.location_access_level
            self.allowed_communities.clear()
            if access_level == 'R':
                if self.primary_community.community_name == '#':
                    region = self.region
                else:
                    region = self.primary_community.region
                if region is not None:
                    communities = Community.objects.filter(region=region)
                    self.allowed_communities.set(communities)
                self.allowed_communities.add(self.primary_community)
            elif access_level == 'A':
                communities = Community.objects.filter(active=True)
                self.allowed_communities.set(communities)
            else:
                communities = self.primary_community
                self.allowed_communities.add(communities)

            print(self.allowed_communities.all())

            #Allowed department access
            dept_access = self.position.department_only_access
            if dept_access:
                depts = [self.position.department]
            else:
                depts = Department.objects.filter(active=True)
            self.allowed_departments.set(depts)

            print(self.allowed_departments.all())
            super().save(*args, **kwargs)

Я пробовал варианты set, clear, add, перемещал super.save() вокруг и помещал логику в сигнал, но ничего не работает. Я пробовал инициировать сохранение как из формы модели через представление, так и из админки.

Позвольте мне ответить в кавычках. Вы можете найти источник в этом разделе.

Если вы хотите обновить значение поля в методе save(), вы можете также добавить это поле в аргумент ключевого слова update_fields. Это обеспечит сохранение поля при указании update_fields.

.

Читайте также здесь

Указание update_fields заставит обновить поле.

Попробуйте вызвать метод super().save(*args, **kwargs) в конце с определением аргумента update_fields. Это заставит обновить вашу модель относительно указанных полей.

Дайте мне знать, как это происходит.

Вернуться на верх