跳转到主要内容

记录对Django模型或模型集合所做的差异

项目描述

Django Diffs

https://travis-ci.org/linuxlewis/django-diffs.svg?branch=master

Django diffs 允许模型在固定时间间隔内缓存其更改(或差异)。

差异存储在redis中,使用SortedSet,并通过在注册的django模型类上的类似管理器对象进行访问。

它与Python 2/3和Django 1.8及以上版本兼容。它需要一个可用的redis服务器。

目录

它是如何工作的?

使用@diffs.register装饰器注册模型,并在信号上序列化和保存其更改到redis。装饰器在注册时将django-dirtyfields安装到模型上,以获取模型实例的更改字段。

可以通过注册模型的diffs管理器访问更改。diffs管理器返回一个包含具有datacreatedtimestamp属性的Diff对象列表。

可以通过类如Question.diffs或作为实例上的相关管理器如instance.diffs访问管理器。

以下是一个快速示例。

# models.py

import diffs

@diffs.register
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

question = Question.objects.create(question_text='What is life?')

question.question_text = 'What is python?'
question.save()

for diff in question.diffs:
    print(diff.timestamp)
    print(diff.data)
    print(diff.created)

diffs = Question.diffs.get_by_object_id(question.id)

为什么?

您需要缓存单个django模型或模型集合的更改,以固定的时间段。

跟踪更改可以防止客户端重新请求所有模型数据,这通常是昂贵的。

入门

  • django-diffs 添加到 requirements.txt

pip install django-diffs
  • diffs 添加到 INSTALLED_APPS

INSTALLED_APPS = (
    'diffs',
)
  • 注册模型

# models.py

import diffs

@diffs.register
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

这就对了!现在将自动跟踪此模型的更改。

配置

Django-diffs可以通过django.conf.settings进行配置。以下为默认配置

# settings.py

DIFFS_SETTINGS = {
    'redis': {
        'host': 'localhost',
        'port': 6379,
        'db': 0,
    },
    'max_element_age': 60*60,
    'use_transactions': True,
    'test_mode': False
}

以下键支持DIFFS_SETTINGS

redis - 一个包含hostportdb等键的字典,用于Redis服务器的详细信息。

max_element_age - 定义单个差异可以持续存在的秒数。这在修剪脚本中用于从集合中删除旧元素。

use_transactions - 布尔值,用于配置django-diffs使用Django的connection.on_commit回调注册。当启用时,django-diffs将延迟持久化到on_commit

test_mode - 布尔值,用于配置使用测试模式。测试模式使用fake_redis而不是真实redis,因此不需要服务器。在运行单元测试时使用此模式。

修剪差异

默认情况下,redis只允许您为整个键设置过期时间。您不能为集合或有序集合中的单个元素设置过期时间。

为了解决这个问题,django-diffs将当前Unix时间戳设置为SortedSet元素的分数。然后可以使用redis命令ZREMRANGEBYSCORE轻松删除项目。

所有这些都在自定义管理命令prune_diffs中为您处理。请按cron计划运行此命令以保持缓存更新。

python manage.py prune_diffs

自定义序列化

默认情况下,django-diffs使用django.core.serializers模块将差异序列化为json。

要使用您自己的自定义序列化格式,只需在您的模型上实现serialize_diff方法。它将传递dirty_fields列表和created关键字参数。

# models.py

import diffs

@diffs.register
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def serialize_diff(self, dirty_fields, created=False):
        return {'fields': dirty_fields}

question = Question.objects.create(question_text='What will happen?')

Question.diffs.get_by_object_id(question.id)[-1].data
# {'fields': ['question_name']}

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django-diffs-0.1.16.tar.gz (7.6 kB 查看哈希值)

上传时间

构建分布

django_diffs-0.1.16-py2.py3-none-any.whl (12.1 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持