我在项目中使用的基于django的应用程序中找到了一个模糊的地方,请查看:
if not request.method == 'POST' or not request.POST.get('openid'):
raise RedirectException(next, _('Invalid POST data'))
if not UserAssociation.objects.filter(user=request.user).count() > 1 and not request.user.email:
raise RedirectException(next, _("You must have at least one OpenID if you don't have email!"))
try:
ua = UserAssociation.objects.get(openid_url=request.POST['openid'], user=request.user)
ua.delete()
except UserAssociation.DoesNotExist:
pass
作者正在尝试为没有电子邮件的用户在表UserAssociation中创建至少一条记录。但是检查记录计数和后续擦除的操作并不是原子的。因此,我们无法确定在调用方法delete()时,我们在表中仍然有超过1条用户记录。
解决类似问题的最佳做法是什么?
答案 0 :(得分:1)
在这种情况下,很简单:只需在过滤的查询集上使用delete()
而不是get()
!
UserAssociation.objects.filter(openid_url=request.POST['openid'], user=request.user).delete()
在其他情况下,通常可以帮助将SQL调用包装在单个数据库事务中。有关说明,请阅读官方transaction docs。