所以,这是我的模特:
class MyModel(models.Model):
timestamp = models.DateTimeField(primary_key=True)
fielda = models.TextField()
当我调用syncdb
时,django不会向postgresql
添加约束,以使时间戳成为唯一,即使它给它主键约束。
如果我将时间戳更改为只是 unique=True
,则django会创建唯一约束。但是,如果我合并unique=True
和primary_key=True
,则django不会创建唯一约束。
我的信息:
如果我在两次不同的游戏(不是同一个游戏)中保存了两次具有相同确切时间戳的模型,那么不会加注并且IntegrityError
就像它应该的那样。但是当它创建唯一约束而没有主键时,它使用相同的代码。
这是我在postgresql中CONSTRAINT "MyModel_pkey" PRIMARY KEY ("timestamp")
时只运行timestamp = models.DateTimeField(primary_key=True)
timestamp = datetime.datetime(2013, 7, 31, 0, 0, 0).replace(tzinfo=utc)
print timestamp # prints 2013-07-31 00:00:00+00:00
row = MyModel(timestamp=timestamp, fielda='test')
row.save()
连续两次运行时,它不会引发IntegrityError
。但是,如果unique=True
和不 primary_key=True
,则 会引发IntegrityError
。
答案 0 :(得分:1)
也许example from the docs可以为您的问题带来一些启示
从技术上讲,主键约束只是a的组合 唯一约束和非空约束。那么,以下两点 表定义接受相同的数据:
CREATE TABLE products ( product_no integer UNIQUE NOT NULL, name text, price numeric ); CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );
[...]主键表示列或列组可以 用作表格中行的唯一标识符[...]添加a 主键将自动创建一个唯一的btree索引 主键中使用的列或列组。 [...]
答案 1 :(得分:0)
Ricola3D将我与同样的问题(已经回答)联系起来解释了我的问题。