2014-10-11 113 views
1

我想保存我的数据库中的条目,以便日后删除它们。要识别他们,我把key属性在我Entrymodels.py,如下图所示:Django Python unique = True表达式

class Entry(models.Model): 
    name = models.CharField(max_length=200) 
    key = models.IntegerField(unique=True,default=0) 

我每次启动服务器时,我会发现,在Entry.objects.all()最大的关键。

我每次启动服务器后创建的第一个新Entry,我想借此key我在一开始就发现,加1,然后我的新Entry其设置为key。对于每个后续的Entry,我将只取上一个元素的key,并将其增加1。将其设置为我的新Entry

然而,在我这样做之前,我想知道Django认为什么是唯一的。例如,如果我最初使用密钥1,23添加了三个条目,然后删除了带有密钥3的最后一个元素。如果我然后重新启动服务器,最大key我会发现是2和下一个Entry我将添加将有key 2 + 1,这又等于3

这是key的独特之处吗? 之前输入过,但我删除了那个元素吧?独特性是由我过去输入的唯一性决定的,还是取决于数据库中当前的元素?

此外,没有Django的保持Entry所有实例的轨道,我补充说,这样它会以某种方式知道如果我之前添加key3Entry?我的数据存储在一个文件

注称为db.sqlite3

谢谢。

+0

你可能想要使用一些自动增量功能。 – tcooc 2014-10-11 09:58:41

回答

0

这和Django根本没有任何关系。这是纯粹的数据库内容:唯一的约束是由数据库独占处理的,在你的情况下是SQLite,尽管其他数据库的功能也完全一样。

当然,唯一约束只考虑实际存在的行:否则会有什么意义?

还有其他的事情要记住您的建议。特别是存在竞争条件的问题:如果您执行查询以获取最大键值,然后使用键+ 1创建一个新行,则会冒着另一个用户的风险同时在键上添加它们自己的行+1。正如Iris和ryanageles所建议的,使用已自动定义为id字段的内置主键更好。

+0

我明白了。现在我只有一个用户,因为这是一个项目。我会尝试只用id。 – user4052205 2014-10-11 10:40:00

0

尝试在您的关键字段中添加primary_key=True

+1

这会做什么?你知道我问的其他东西吗? – user4052205 2014-10-11 09:57:41

2

好像你正在寻找一些已经存在的东西;模型默认有一个id字段,它是唯一的和单调的(新条目有更大的id)。

+0

我可以使用,但我的模板结构的方式,我无法传入我正在删除的图像的ID。我可能会重组它。 – user4052205 2014-10-11 10:38:01