擅长:python、mysql、java
<p>通常,“请求原谅”原则在编程中是一个很好的实践,但在这种特殊情况下,我不建议这样做。</p>
<p>您要查找的异常是<code>IntegrityError</code>。只需删除try-catch块并强制执行异常,您就可以轻松地了解这一点。回溯显示异常类。</p>
<p>问题是,存在几种不同的完整性错误,因此在try-catch块中,必须检查类似<code>if ex.pgcode == 23505</code>的内容,以查看这是否是一个唯一的约束错误。这在这里之前已经得到了回答:<a href="https://stackoverflow.com/questions/12490172/integrityerror-distinguish-between-unique-constraint-and-not-null-violations">IntegrityError: distinguish between unique constraint and not null violations</a></p>
<p>更糟糕的是:每个ORM都有不同的错误代码,字段名不会是<code>pgcode</code>,但是其他一些ORM和一些ORM根本不会抛出唯一的约束。因此,如果您正在构建一个可重用的应用程序,或者如果您正在使用一个糟糕的ORM(如MySQL),或者如果您不确定将来是否会更改项目的数据库,您不应该这样做!</p>
<p>更好的方法是简单地删除try catch块,并在保存之前检查对象是否已经在数据库中。</p>
<p>我不知道哪个字段在您的情况下是唯一的,所以我假设它是<code>user</code>字段。您的代码如下所示:</p>
<pre><code>answers = AnswerModel.objects.filter(user=user)
if answers:
return HttpResponseRedirect('/user/already_exists')
obj = AnswerModel.objects.create(user=user, yes_question=question_model)
...
</code></pre>
<p>如果要处理组合的唯一约束,第一行是:</p>
<pre><code>answers = AnswerModel.objects.filter(user=user, yes_question=question_model)
</code></pre>