【问题标题】:postgresql django: how to store an array of instances of variable type?postgresql django:如何存储变量类型的实例数组?
【发布时间】:2016-02-06 15:01:22
【问题描述】:

假设您正在创建一个博客,并且每篇博文都包含一组交错的文本片段和 svg 片段(例如)。

您将每个片段存储在自定义 django 字段中(例如 HTMLFieldSVGField)。

最好的组织方式是什么?

如何维护分片的顺序?这个解决方案看起来很丑:

class Post(models.Model):
    title = CharField(1000)

class Fragment(models.Model):
    index = IntegerField()
    html = HTMLField()
    svg = SVGField()
    post = ForeignKey(Post)

【问题讨论】:

  • 创建一个单独的模型来存储这些。您不能依赖字段,因为听起来您不知道有多少字段。
  • @ShangWang 我正在尝试使用一对多的关系,但是如何保持片段的顺序?只使用整数字段?
  • 你有多少种不同的类型?如果你没有很多,你的方式很好,使用整数字段来存储订单。
  • 我有两种类型。但是在附加帖子时,如果我的帖子包含 20 个片段,我必须遍历它们以找到索引最大的那个。我必须手动实现 CRUD 操作,与非关系数据库相比,这非常无效。
  • 不,您只需执行Fragment.objects.filter(post=current_post).latest('index') 即可找到最大的索引。如果你想从头到尾,请Fragment.objects.filter(post=current_post).order_by('index')。只需利用 ORM 操作就很容易了。

标签: django postgresql


【解决方案1】:

如前所述,单独的模型是记录所有片段的可行方法。我们使用一个IntegerField 来记录分片顺序,以便稍后可以恢复整个Post

这里有一些警告:

  1. 使用 order_bylatest 或 slice n dice 操作来排序/查找元素。
  2. 当需要插入/删除操作时,它会破坏整个顺序。我们需要增加/减少多个元素来维持顺序。使用 queryset 和 F() 表达式一次更改多条记录,如另一篇 SO 帖子 here 中所述。

该方法存在一些不完善之处,但这是迄今为止我能想到的最好的解决方案(我之前遇到过类似的情况)。链表是一种好方法,但它对数据库不友好,因为要获取所有片段,我们需要 O(n) 操作而不是使用查询集的 O(1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多