【发布时间】:2012-12-25 22:55:44
【问题描述】:
在 Django 中,如何处理与 Post 对象关联的图像的并发更改?
这是一种以前曾提出过的问题,但并未完全涵盖相同的问题。我已经阅读了这些(question、question、question 和 question),但问题略有不同。
我有一个博客文章模型(速度的伪代码),其中包含标题、摘要和正文,以及相关的图像。
class Post(models.Model):
title = CharField
abstract = TextField
body = TextField
class Image(models.Model):
post = ForeignKey(Post)
imagefile = ImageField
现在,我要添加的是存储此Post 模型更改历史记录的功能。为此,我想到了两种可能性:
可能性1
class PostHistory(models.Model):
post = ForeignKey(Post)
title_delta = TextField
abstract_delta = TextField
body_delta = TextField
但是,这存在一个问题,即它存储了没有更改的增量(例如,当title 没有更改并且body 字段只有一个增量时。也就是说,当多个字段更改时,它适合“1 个修订版 == 1 个完整修订版”。
可能性2
class PostRevision(models.Model):
post = ForeignKey(Post)
field = CharField #Field name
delta = TextField
通过两种不同的方法,这成功地为我提供了该领域的差异历史,我将使用 diff-match-patch 生成它(比内置的 difflib 性能略高)。我现在遇到的两个问题与主对象的生成有关(即链中的最高修订版)。
提出的问题是:如何处理与 Post 对象关联的图像的并发更改?这些将通过 Post 模型的 body 字段中的引用进行更改(这是一个 Markdown 格式的文本字段,然后在表单的 POST 上进行编辑,以添加到图像字段的 URL 引用中)。解决此问题的最佳方法是在修订版和 Post 对象上使用 M2M 字段,从而允许始终将图像与 PostRevision 对象一起存储?
【问题讨论】:
-
我读得不好或误解了,但您是要保存每个字段修订版还是整个对象?
-
好吧,这是困境的一部分,我是否每次都保存整个对象的差异(可能性 1)(对于许多字段,这基本上是“零更改”,或者保存更改的各个字段的差异(可能性 2)?
-
如果一个修订与另一个修订具有相同的标题,那会很糟糕吗?
-
不,这是完全可以接受的情况。假设我选择可能性 1,那么这就消除了匹配增量、字段和对象的问题,并使其保持相当原子性——一个修订就是一个修订。下一个问题(绑定图像字段),我可能会在图像和修订对象之间使用 M2M 来解决这个问题,这听起来合理吗?
标签: python django django-models version revision-history