Если это действительно все в базе данных, это, очевидно, IntegrityError. Однако, если это происходит до, он делает это в базе данных - скажем, в методе сохранения в классе менеджера - что было бы правильным исключением для рейза?Какое правильное исключение возникает при попытке создать запись Django, когда разрешена только одна запись.
Пример:
class MyManager(models.Manager):
def create_from_user(self, user):
try:
existing = self.get(user=user)
raise Exception("There is already an object for this user.") # more specific exception needed
except self.DoesNotExist:
# begin creating the record
Из-за характер записи, я не хочу ситуации типа get_or_create (я хочу, используя этот метод, когда запись уже существует, чтобы быть серьезной ошибкой, которая генерирует исключение) ,
Предполагая, что я помещаю уникальные ограничения в таблицу, очевидно, что в итоге будет выведено IntegrityError, но я бы предпочел не полагаться на это и вместо этого сделать это явным в коде. Но я не уверен, какое исключение является наиболее точным (или если я должен бросить свой собственный).
Что дает мне паузу в PEP: «Исключение возникает, когда влияет реляционная целостность базы данных, например проверка внешнего ключа». Из-за того, как устроена база данных, она может или не может повлиять на реляционную целостность, а на самом деле из-за устаревших данных я, вероятно, не могу помещать эти ограничения в базу данных. –
В этом случае вы можете бросить «DatabaseError», родительский класс «IntegrityError», с собственным сообщением об ошибке или создать подкласс «DatabaseError» специально для этой ситуации (например, «SaveIntegrityError»). –
Хммм ... Я просто посмотрел на сопоставимую функцию 'User.objects.create_user' и не пытается поймать ошибку и полагается на базу данных. Так что, возможно, это то, что я должен делать, и просто продолжайте и нормализуйте базу данных как можно лучше. Я предполагаю, что идея заключается в том, что менеджеры должны предполагать, что все хреново и полагается на базу данных, чтобы поймать эти ошибки ... –