Возникла ошибка целостности из-за того, что ограничение не может быть переопределено в панели администратора Django
У меня есть 4 класса, как показано ниже:
from django.db import models
class A(models.Model):
title = models.CharField(max_length=100)
class B(models.Model):
title_b = models.CharField(max_length=100)
a = models.ForeignKey(A, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['title_b'], name='unique_title_b')
]
class C(models.Model):
title_c = models.CharField(max_length=100)
a = models.ForeignKey(A, on_delete=models.CASCADE)
class D(models.Model):
title_d = models.CharField(max_length=100)
a = models.ForeignKey(A, on_delete=models.CASCADE)
Все связанные классы используются как Inline-модель, которая описана ниже:
from django.contrib import admin
class BInline(admin.TabularInline):
model = B
class CInline(admin.TabularInline):
model = C
class DInline(admin.TabularInline):
model = D
А модель администратора класса А определяется как
class AAdmin(admin.ModelAdmin):
inlines = [BInline, CInline, DInline]
Как вы видите, класс B имеет ограничение на уникальность заголовка. Если я ввожу дубликаты данных для класса B в админ-панели, возникает ошибка целостности и появляется страница ошибки с заголовком IntegrityError at /app/A/81ac3366-4cdb-4cbb-a861-340ff188c760/change/
дублирующее значение ключа нарушает ограничение уникальности "unique_title_b"
ПОДРОБНОСТИ: Ключ (title)=(TestDuplicate) уже существует. показано.
Для того чтобы показать пользователю дружественное сообщение, а не эту страницу ошибки, я переопределяю метод save_related
в class AAdmin
, как показано ниже:
def save_related(self, request, form, formsets, change):
try:
with transaction.atomic():
super().save_related(request, form, formsets, change)
except IntegrityError as e:
self.message_user(request, 'A related model constraint was violated: {}'.format(e), level=messages.ERROR)
Я ожидал, что после переопределения метода save_related
страница ошибки больше не будет отображаться, и пользователь останется на той же странице модели изменений в панели администратора; но после внесения этих изменений страница ошибки снова отображается с заголовком "У объекта CFormFormSet нет атрибута 'new_objects'".
Может ли кто-нибудь объяснить мне, где я ошибся?