首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果Django-reversion中没有任何变化,不要创建新版本。

如果Django-reversion中没有任何变化,不要创建新版本。
EN

Stack Overflow用户
提问于 2015-05-25 13:23:30
回答 1查看 973关注 0票数 6

我想保存新的对象版本,只有当一些东西已经改变,在django-reversion中。我翻阅了文件,却没有发现任何关于它的东西。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-17 11:34:30

您可以使用选项。不幸的是

它不遵循关系,因为这可能会很快变得昂贵和缓慢。

如果您真的想忽略后续关系的重复,您有两种可能性:

  1. 执行分叉并禁用限制

在这里删除and explicit https://github.com/etianen/django-reversion/blob/master/reversion/revisions.py#L199

默认情况下将ignore_duplicates设置为True https://github.com/etianen/django-reversion/blob/master/reversion/revisions.py#L368

要小心,正如上面提到的,它可能是缓慢的。

  1. 侦听修订后提交信号并手动删除重复版本

ignore_duplicates设置为False并添加信号接收器:

代码语言:javascript
复制
from django.db import transaction
from django.dispatch import receiver
from reversion.models import Revision, Version
from reversion.signals import post_revision_commit


def clear_versions(versions, revision):
    count = 0
    for version in versions:
        previous_version = Version.objects.filter(
            object_id=version.object_id,
            content_type_id=version.content_type_id,
            db=version.db,
            id__lt=version.id,
        ).first()
        if not previous_version:
            continue
        if previous_version._local_field_dict == version._local_field_dict:
            version.delete()
            count += 1
        if len(versions_ids) == count:
            revision.delete()


@receiver(post_revision_commit)
def post_revision_commit_receiver(sender, revision, versions, **kwargs):
    transaction.on_commit(lambda: clear_versions(versions, revision))

它也可能很慢,但您可以异步完成(例如,在芹菜任务中):

代码语言:javascript
复制
# tasks.py

@celery.task(time_limit=60, ignore_result=True)
def clear_versions(revision_id, versions_ids):
    count = 0
    if versions_ids:
        for version in Version.objects.filter(id__in=versions_ids):
            previous_version = Version.objects.filter(
                object_id=version.object_id,
                content_type_id=version.content_type_id,
                db=version.db,
                id__lt=version.id,
            ).first()
            if not previous_version:
                continue
            if previous_version._local_field_dict == version._local_field_dict:
                version.delete()
                count += 1
    if len(versions_ids) == count:
        Revision.objects.only('id').get(id=revision_id).delete()

# signals.py

@receiver(post_revision_commit)
def post_revision_commit_receiver(sender, revision, versions, **kwargs):
    transaction.on_commit(
        lambda: clear_versions.delay(revision.id, [v.id for v in versions])
    )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30439461

复制
相关文章

相似问题

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