Как правильно обрабатывать уникальное ограничение IntegrityError в Django 3.2
Здравствуйте, я столкнулся с такой простой вещью. Мне нужна валидация с двумя полями в модели, их комбинация должна быть уникальной. Это работает почти так, как я хочу, но когда я пытаюсь добавить новую комбинацию она поднимает IntegrityError вместо ошибки валидации в моей форме. Есть ли какое-нибудь решение, чтобы справиться с этим?
#Model (это не все поле, но оно не является необходимым в моем вопросе):
class AggSubnet(models.Model):
region = models.ForeignKey("db_info.Region", on_delete=models.PROTECT, related_name='get_agg_by_region')
subnet_ip = models.GenericIPAddressField()
class Meta:
constraints = [
models.UniqueConstraint(fields=['subnet_ip','region'], condition=~Q(subnet_ip__startswith='172.'), name='agg_subnet_unique'),
]
def __str__(self):
return f'{self.region} {self.subnet_ip}/{self.subnet_prefix}'
def get_absolute_url(self):
return reverse(f'{self.__class__.__name__}{DETAIL_SUFFIX}', kwargs={"pk": self.pk})
#View:
class AggregateSubnetCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = AggregateSubnet
template_name = 'Subnet_create.html'
fields = ('region', 'subnet_ip')
success_message = "%(subnet_ip)s was created successfully"
def form_valid(self, form):
form.instance.created_by = self.request.user
form.instance.updated_by = self.request.user
return super().form_valid(form)
#Шаблон
Я имею в виду, как я могу заменить: введите описание изображения здесь на что-то вроде этого: enter image description here
добавьте эту строку в вашу модель Meta
класса:
unique_together = (('subnet_ip', 'region'),)
Но сохраните ограничение на месте.
Вы также можете добавить валидацию в процессе очистки формы:
class AggSubnet(models.Model):
def clean(self):
if self.__class__._default_manager.filter(region=self.region, subnet_ip=self.subnet_ip).exlude(pk=self.pk).exists():
raise forms.ValidationError(...)
Я использую все три из них одновременно на всякий случай.