Форма администратора Django выдает IntegrityError для модели с условным UniqueConstraint

Меня попросили добавить некоторую логику для моделирования уникальности. Каждый Платеж должен иметь заполненный либо transaction_id, либо payment_id. Каждый платеж идентифицируется по (transaction_id, operation, payment_created_date) или (payment_id, operation, payment_created_date). На уровне базы данных это работает нормально. Вставка платежа с одним и тем же transaction_id, operation, payment_created_date дважды приводит к нарушению уникального ограничения. Для этой модели я создал страницу администратора. Но вставка одной и той же строки на странице администратора приводит к ошибке IntegrityError at /admin/finance/payment/add/ duplicate key value violates unique constraint "unique_finance_payment_without_payment_id" DETAIL: Key (transaction_id, operation, payment_created_date)=(dasdasd, Refund, 2021-10-04) already exists. вместо простой и удобной для пользователя ошибки администратора Please correct the error below. Payment with this Transaction id, Operation and Payment created date already exists. Как заставить Django admin поймать эту IntegrityError и показать ее в форме администратора?

вот мой models.py

а это мой admin.py

class PaymentForm(forms.ModelForm):

    class Meta:
        fields = (
            'report_name',
            'operation',
            'payment_created_date',
            'amount',
            'commission',
            'currency',
            'transaction_id',
            'payment_id',
        )



@admin.register(Payment)
class PaymentAdmin(ImportExportMixin, admin.ModelAdmin):
    form = PaymentForm
    list_display = [
        'report_name',
        'operation',
        'payment_created_date',
        'amount',
        'commission',
        'currency',
        'transaction_id',
        'payment_id',
    ]
    list_filter = (
        'report_name',
        'operation',
        ('payment_created_date', DateRangeFilter),
    )
    search_fields = ['report_name__name', 'operation']
    resource_class = PaymentResource

    class Meta:
        model = Payment
Вернуться на верх