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
. Это заставит обновить вашу модель относительно указанных полей.
Дайте мне знать, как это происходит.