我的模型的uniqueblogname
元素设置为Unique=True
。在我看来,我做了类似的事情:
try:
MyModel.objects.get(uniqueblogname=userinput) #i ask the user to input
#a name of a blog they want to own on the site (all blogs must have a unique name)
#if taken then prints some error messages that the blog name is taken.....
except MyModel.DoesNotExist:
MyModel.objects.create(uniqueblogname=userinput) #if no blog has that name then
#the blog object is created
我最近通过将dumpdata和loaddata更新到一个全新的空白数据库并将新模型更改迁移到此数据库来更新我的数据库(我想保留旧数据库的原理并将其存档)。一切顺利。新的迁移没有错误。但是,现在每当我执行上述检查时,如果我搜索任何旧的blogname,那么我会收到此错误:
1062, "Duplicate entry (the user's input here) for key 'uniqueblogname'"
但是,如果我搜索一个全新的blogname并创建了该对象,那么我使用此检查再次搜索它,一切正常。似乎用于尝试检索旧MyModel
对象的代码没有得到正确执行,并且django尝试创建新的MyModel
只是为了意识到它将是重复的,因此抛出此错误。
关于这个错误最令人困惑的部分就像我说的:如果我创建一个全新的blogname并输入它,并且该对象是在这个新数据库中新创建的,那么这个检查条件每次都能完美地工作(所以我不会&#39 ; t怀疑这是我代码中的逻辑问题)。但是,我似乎无法检查我使用loaddata填充的旧东西。
有什么想法吗?非常感谢任何建议。谢谢。
答案 0 :(得分:0)
如果不了解更多内容,很难评论您的具体案例。我首先看一下数据库本身,看看你的旧行与新创建的行有什么不同。
我想指出您当前的代码有竞争条件,因为另一个进程可能会在get()
和create()
之间插入一个具有相同名称的行。我建议改用get_or_create()
。
此方法是原子的,假设正确使用,正确的数据库配置和底层数据库的正确行为。