Django переопределяет сообщение об ошибке, которое Django показывает для ошибки UniqueConstraint?

#python #django #django-rest-framework

#питон #джанго #django-rest-фреймворк

Вопрос:

Я хочу настроить сообщение по умолчанию с ограничениями метакласса. Вот моя модель, которую я разрабатывал.

 class BusRoute(BaseModel):
    route = models.ForeignKey(Route, on_delete=models.PROTECT)
    shift = models.ForeignKey(
        Shift,
        null=True,
        on_delete=models.PROTECT
    )
    journey_length = models.TimeField(null=True)
    

    class Meta:
        default_permissions = ()
        verbose_name = 'Bus  Route'
        verbose_name_plural = 'Bus  Routes'
        constraints = [
            models.UniqueConstraint(
                fields=['route', 'shift'],
                name='unique_bus_company_route'
            )
        ]
 

Сообщение об ошибке ограничения по умолчанию выглядит следующим образом

 Bus  Route with this  Shift already exists.
 

Есть ли какой-нибудь выход, я могу настроить это сообщение об ограничении на что-то вроде,

 Bus Route and shift already in use please validate again
 

Ответ №1:

Я только что выяснил, как создать пользовательскую ошибку UniqueConstraint при использовании CBV CreateView и формы ModelForm.

В ModelForm я добавил это:

 def validate_unique(self):
    """
    Call the instance's validate_unique() method and update the form's
    validation errors if any were raised.
    """
    exclude = self._get_validation_exclusions()
    try:
        self.instance.validate_unique(exclude=exclude)
    except ValidationError as e:
        error = {'__all__': "Custom error message."}
        self._update_errors(error)
 

В основном это код класса по умолчанию, за исключением того, что я отредактировал содержимое в блоке except .

Ответ №2:

Вы могли бы использовать оператор try и except, чтобы перехватить ошибку UniqueConstraint и вместо этого создать свою собственную. Насколько я знаю, в django нет никаких положений для прямого переопределения ошибки ограничения unique, поэтому это можно рассматривать как наилучшую практику.

Реализация идеи:

 bus_route = BusRoute(**field_data)
try:
    bus_route.save()
except IntegrityError as err:
    raise CustomException('CUSTOM ERROR MESSAGE')
 

Комментарии:

1. извините, но куда мне включить следующий блок try?

2. где бы вы ни хотели сохранить свою модель.