django中的有序列表

时间:2009-01-09 14:06:14

标签: python django django-models

我有一个非常简单的问题。我需要创建表示有序列表元素的模型。这个模型可以像这样实现:

class Item(models.Model):
    data = models.TextField()
    order = models.IntegerField()

或者像这样:

class Item(models.Model):
    data = models.TextField()
    next = models.ForeignKey('self')

首选哪种方式?每个解决方案有哪些缺点?

3 个答案:

答案 0 :(得分:21)

基本上,您提出的第二个解决方案是链接列表。在数据库级实现的链表通常不是一个好主意。要检索n元素列表,您需要n数据库访问(或使用复杂查询)。性能方面,在O(n)中检索列表非常有效。

在常规代码中,链接列表用于获得与数组相比更好的插入性能(无需移动所有元素)。在您的数据库中,仅在2个查询中更新所有元素并不复杂:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)

我记得看到一个可重复使用的应用程序实现了所有这一切和一个很好的管理界面,但我现在无法找到它...

总结一下,明确使用解决方案#1并远离解决方案#2,除非你有非常好的理由不这样做!

答案 1 :(得分:6)

这取决于你想做什么。

第一个似乎更好的是在数据库中进行单个查询并以正确的顺序获取所有数据

第二个似乎更好的是在两个现有元素之间插入一个元素(因为在第一个元素中,如果数字是连续的,你必须更改很多项目)

我会使用第一个,因为它似乎更适合数据库表,这就是django如何将模型数据存储在引擎盖后面。

答案 2 :(得分:-6)

还有另一种解决方案。

class Item(models.Model):
    data = models.TextField()

您可以将Python列表挑选或编组到数据字段中并加载它。这个适用于更新和阅读,但不适用于搜索,例如获取包含特定项目的所有列表。