相关疑难解决方法(0)

Django:何时自定义保存与使用保存后信号

我在数据库中有一系列测试和案例.每当测试被废弃时,它都会过时,并且该测试的任何子案例也应该过期.我认为有两种方法可以做到这一点:

1)将保存功能修改为结束日期子案例.
2)创建一个侦听正在保存的测试模型的接收器,然后结束其子案例的日期.

有没有理由使用另一个以外的人?

编辑:我看到这篇博文建议在检查模型的给定值时使用save方法.因为我正在检查end_date,也许这表明我应该使用自定义保存?

Edit2:另外,对于记录,完整的层次结构是Protocol - > Test - > Case - > Planned_Execution,并且只要一个end_dated,每个子节点也必须是endDated.我想我最终会为每个人做同样的事情.

编辑3:事实证明,为了判断当前的save()是否是结束测试的那个,我需要访问旧数据和新数据,所以我使用了自定义保存.这是它的样子:

def save(self):
    """Use a custom save to end date any subCases"""
    try:
        orig = Test.objects.get(id=self.id)
        enddated = (not orig.end_date) and self.end_date is not None   
    except:
        enddated = False

    super(Test, self).save()

    if enddated:
        for case in self.case_set.exclude(end_date__isnull=False):
            case.end_date = self.end_date
            case.enddater = self.enddater
            case.save()
Run Code Online (Sandbox Code Playgroud)

python django save receiver

22
推荐指数
2
解决办法
4624
查看次数

Django中的模型历史

这是一个以前曾被问过的问题,但不完全涵盖相同的问题.我已经阅读了这些(问题,问题,问题问题),但问题略有不同.

我有一个博客文章模型(速度伪代码),其中包含标题,摘要和正文以及相关的图像.

class Post(models.Model):
    title = CharField
    abstract = TextField
    body = TextField

class Image(models.Model):
    post = ForeignKey(Post)
    imagefile = ImageField
Run Code Online (Sandbox Code Playgroud)

现在,我想要添加的是能够存储此Post模型的更改历史记录.我想到了两种可能性:

可能性1

class PostHistory(models.Model):
    post = ForeignKey(Post)
    title_delta = TextField
    abstract_delta = TextField
    body_delta = TextField
Run Code Online (Sandbox Code Playgroud)

然而,这有一个问题,即它存储增量没有变化(例如,当title没有变化时,body字段只有一个增量.也就是说,当多个字段发生变化时,它符合'1版本== 1完成修订版".

可能性2

class PostRevision(models.Model):
    post = ForeignKey(Post)
    field = CharField #Field name
    delta = TextField
Run Code Online (Sandbox Code Playgroud)

通过两种不同的方法,这成功地给了我一个场的差异历史,我将使用diff-match-patch生成(比内置的difflib稍微高一些).我现在遇到的两个问题与主对象的生成有关(即链中的最高版本).

问题是,我如何处理与Post对象关联的图像的并发更改,因为这些将通过模型body字段内的引用进行更改Post(这是Markdown格式化的文本字段,然后进行编辑POST …

python django version django-models revision-history

5
推荐指数
1
解决办法
4756
查看次数