2012-06-29 1 views
2

Если это действительно все в базе данных, это, очевидно, 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, но я бы предпочел не полагаться на это и вместо этого сделать это явным в коде. Но я не уверен, какое исключение является наиболее точным (или если я должен бросить свой собственный).

ответ

1

Почему бы не бросить IntegrityError? В некотором смысле, ваш код, связанный с базой данных, обнаружил, что проблема целостности должна произойти. Нет необходимости составлять другую ошибку/исключение, чтобы описать то, что уже имеет имя.

+0

Что дает мне паузу в PEP: «Исключение возникает, когда влияет реляционная целостность базы данных, например проверка внешнего ключа». Из-за того, как устроена база данных, она может или не может повлиять на реляционную целостность, а на самом деле из-за устаревших данных я, вероятно, не могу помещать эти ограничения в базу данных. –

+0

В этом случае вы можете бросить «DatabaseError», родительский класс «IntegrityError», с собственным сообщением об ошибке или создать подкласс «DatabaseError» специально для этой ситуации (например, «SaveIntegrityError»). –

+0

Хммм ... Я просто посмотрел на сопоставимую функцию 'User.objects.create_user' и не пытается поймать ошибку и полагается на базу данных. Так что, возможно, это то, что я должен делать, и просто продолжайте и нормализуйте базу данных как можно лучше. Я предполагаю, что идея заключается в том, что менеджеры должны предполагать, что все хреново и полагается на базу данных, чтобы поймать эти ошибки ... –

5

Я бы сказал, что это был ValidationError. Это то, что Django выбрасывает в форму и моделирует чистые методы, когда встречает дублируемую запись в уникальном поле.

+0

Это кажется ближе. Я, вероятно, поеду с этим, если кто-то не убедит меня иначе. –

+0

ValidationError - это то, что я бы использовал здесь - и на самом деле то, что я уже использовал для подобных ситуаций. –

Смежные вопросы