首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django中的有序列表

django中的有序列表
EN

Stack Overflow用户
提问于 2009-01-09 14:06:14
回答 3查看 4.8K关注 0票数 13

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

代码语言:javascript
复制
class Item(models.Model):
    data = models.TextField()
    order = models.IntegerField()

或者像这样:

代码语言:javascript
复制
class Item(models.Model):
    data = models.TextField()
    next = models.ForeignKey('self')

哪种方式是首选的?每种解决方案都有什么缺点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-01-09 14:17:27

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

在常规代码中,链表用于获得比数组更好的插入性能(不需要移动所有元素)。在您的数据库中,更新所有元素并不是那么复杂,只需两个查询:

代码语言:javascript
复制
UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)

我记得我看到过一个实现了所有这些的可重用的应用程序和一个很好的管理界面,但我现在找不到它了……

总而言之,一定要使用解决方案#1,并远离解决方案#2,除非你有非常非常好的理由不这样做!

票数 21
EN

Stack Overflow用户

发布于 2009-01-09 14:12:35

这取决于你想做什么。

第一种方法似乎更适合在数据库中进行一次查询,并以正确的顺序获取所有数据

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

我使用第一个,因为它似乎更适合数据库表,这是django在幕后存储模型数据的方式。

票数 6
EN

Stack Overflow用户

发布于 2009-01-09 15:22:38

还有另一种解决方案。

代码语言:javascript
复制
class Item(models.Model):
    data = models.TextField()

您只需将Python列表打包或编组到数据字段并加载它即可。这是一个很好的更新和阅读,但不是搜索,例如获取包含特定项目的所有列表。

票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/428149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档