Django datetime主键不限制唯一

时间:2013-07-31 08:22:05

标签: python django postgresql django-models django-south

所以,这是我的模特:

class MyModel(models.Model):
    timestamp = models.DateTimeField(primary_key=True)
    fielda = models.TextField()

当我调用syncdb时,django不会向postgresql添加约束,以使时间戳成为唯一,即使它给它主键约束。

如果我将时间戳更改为只是 unique=True,则django会创建唯一约束。但是,如果我合并unique=Trueprimary_key=True,则django不会创建唯一约束。

我的信息:

  • django-south v1.8
  • django 1.4
  • python 2.7
  • postgresql 9.1

编辑:

如果我在两次不同的游戏(不是同一个游戏)中保存了两次具有相同确切时间戳的模型,那么不会加注并且IntegrityError就像它应该的那样。但是当它创建唯一约束而没有主键时,它使用相同的代码。

编辑2:

这是我在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

2 个答案:

答案 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将我与同样的问题(已经回答)联系起来解释了我的问题。

Answered Question