我可以安全地假设Django模型ID在save()时是唯一的

时间:2014-05-04 03:05:53

标签: django django-models

我需要在我的数据库中存储匹配项,这些匹配项已经具有唯一ID。如需进一步的帮助和参考,我最好保留此ID:

match = Match(id=my8digitsid)
match.save()

但是,传入的比赛(尚未播放)还没有ID。我可以安全地保存我的比赛如下:

match = Match()
match.save

然后,一旦比赛发生,就这样修改:

match.id = my8digitsid

当我安全地说,我的意思是生成的默认ID(我猜是自动递增)是否唯一,并且不会与我的自制 ID发生任何冲突。

1 个答案:

答案 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的标准行为。

相关问题