0

所以,这是我的模型:

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

当我调用时syncdb,django 不会postgresql为时间戳添加唯一的约束,即使它为它提供了主键约束。

如果我将 timestamp 更改为just unique=True,django 会创建唯一约束。但是,如果我结合unique=Trueand primary_key=True,django 不会创建唯一约束。

我的资料:

  • django-south v1.8
  • django 1.4
  • 蟒蛇2.7
  • PostgreSQL 9.1

编辑:

如果我在两次不同的运行(不是相同的过程)中两次保存具有相同确切时间戳的模型,它不会引发并且IntegrityError应该如此。但是当它创建唯一约束并且没有主键时,它使用相同的代码。

编辑2:

这是我CONSTRAINT "MyModel_pkey" PRIMARY KEY ("timestamp")在 postgresql中运行的代码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=Trueand not primary_key=True时,它确实会引发IntegrityError.

4

2 回答 2

1

也许文档中的示例可以为您的问题带来一些启示

从技术上讲,主键约束只是唯一约束和非空约束的组合。因此,以下两个表定义接受相同的数据:

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 );

[...] 主键表示一列或一组列可以用作表中行的唯一标识符 [...] 添加主键将自动在列或组上创建唯一的 btree 索引主键中使用的列。[...]

于 2013-07-31T09:10:49.183 回答
0

Ricola3D将我链接到解释我的问题的同一个问题(已回答)。

已回答的问题

于 2013-08-02T18:21:52.653 回答