Перезапись метода сохранения для обеспечения целостности в базе данных не работает
У пользователя всегда есть одна приборная панель по умолчанию для каждой компании, с которой он связан. Они могут добавлять новые приборные панели, но как только они устанавливают одну из них по умолчанию, другая сбрасывается. Чтобы добиться этого, я попробовал переписать метод сохранения в модели Dashboard:
def save(self, *args, **kwargs):
if self.is_default:
for dash in Dashboard.objects.filter(user=self.user, company=self.company):
if dash.is_default:
dash.is_default = False
dash.save()
else:
if Dashboard.objects.filter(user=self.user, company=self.company, is_default=True).exclude(id=self.id).count() == 1:
raise ValidationError(
'There has to be a default dashboard per company for this user.')
return super().save(*args, **kwargs)
Приведенный выше код не работает, так как он позволяет мне установить приборную панель с is_default=False и не вызывает ValidationError, если критерии не выполняются.
Я предлагаю следующее изменение:
...
if not Dashboard.objects.filter(user=self.user, company=self.company, is_default=True).exclude(id=self.id).exists():
raise ValidationError()
...