我需要在我的数据库中存储匹配项,这些匹配项已经具有唯一ID。如需进一步的帮助和参考,我最好保留此ID:
match = Match(id=my8digitsid)
match.save()
但是,传入的比赛(尚未播放)还没有ID。我可以安全地保存我的比赛如下:
match = Match()
match.save
然后,一旦比赛发生,就这样修改:
match.id = my8digitsid
当我安全地说,我的意思是生成的默认ID(我猜是自动递增)是否唯一,并且不会与我的自制 ID发生任何冲突。
答案 0 :(得分:3)
是的,您可以确定ORM会创建文档here中提到的唯一ID。数据库是计算新数字的数据库。
如果模型有一个AutoField - 一个自动递增的主键 - 那么 将计算自动递增的值并将其另存为 第一次调用save()时对象的属性:
>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
>>> b2.id # Returns None, because b doesn't have an ID yet.
>>> b2.save()
>>> b2.id # Returns the ID of your new object. There’s no way to tell what the value of an ID will be before you call save(), because
该值由您的数据库计算,而不是由Django计算。
为方便起见,默认情况下,每个模型都有一个名为id的AutoField 除非你在你的字段中明确指定primary_key = True 模型。
如果您想使用此ID,也可以提供ID。我在Django文档中复制了以下信息。
明确指定自动主键值如果模型有 AutoField但您想要明确定义新对象的ID 保存,只需在保存之前明确定义,而不是依赖 关于ID的自动分配:
>>> b3 = Blog(id=3, name='Cheddar Talk', tagline='Thoughts on cheese.') >>> b3.id # Returns 3. >>> b3.save() >>> b3.id # Returns 3.
如果手动分配自动主键值,请确保不要使用 已存在的主键值!如果使用创建新对象 数据库中已存在的显式主键值, Django将假设您正在更改现有记录而不是 创造一个新的。
鉴于上述' Cheddar Talk'博客的例子,这个例子会 覆盖数据库中的上一条记录:
b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.')
b4.save() # Overrides the previous blog with ID=3!
但我不建议您自己指定该ID。我认为使用来自它们的ID创建模型的字段更方便。
我之所以不推荐这个原因,是因为在插入之前,您必须始终确认所提供的ID尚未使用。作为一般规则,我尽量避免尽可能地修改Django的标准行为。