#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. где бы вы ни хотели сохранить свою модель.