记录对Django模型或模型集合所做的差异
项目描述
Django Diffs
Django diffs 允许模型在固定时间间隔内缓存其更改(或差异)。
差异存储在redis中,使用SortedSet,并通过在注册的django模型类上的类似管理器对象进行访问。
它与Python 2/3和Django 1.8及以上版本兼容。它需要一个可用的redis服务器。
目录
它是如何工作的?
使用@diffs.register装饰器注册模型,并在信号上序列化和保存其更改到redis。装饰器在注册时将django-dirtyfields安装到模型上,以获取模型实例的更改字段。
可以通过注册模型的diffs管理器访问更改。diffs管理器返回一个包含具有data、created和timestamp属性的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 - 一个包含host、port和db等键的字典,用于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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bd6ac5f643ea3ca731cc753185c49380d59641d395dee6f6e36a2f5330b706fb |
|
MD5 | 93f04972b8079d6f396ce7a27b215b11 |
|
BLAKE2b-256 | 20778f92e42120f64272e5ba43ade096b517b0ec0afc56e7a1fa23a67db17180 |
django_diffs-0.1.16-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a2f399c21e249f9e3657c51ea3202e81947565e7dfc088c6077381973e23d899 |
|
MD5 | 413f40e369808cb7263d8d4a81ed03c0 |
|
BLAKE2b-256 | 0fd0b4db96626e1282abc609615232be7cd85935335e6e233632cb98d8bc0536 |