从包 django-reversion 的 field_dict 中过滤特定的字段名称和值
filter particular field name and value from field_dict of package django-reversion
我有一个函数,其中 returns json 数据作为 reversion.models.
版本的历史记录
from django.http import HttpResponse
from reversion.models import Version
from django.contrib.admin.models import LogEntry
import json
def history_list(request):
history_list = Version.objects.all().order_by('-revision__date_created')
data = []
for i in history_list:
data.append({
'date_time': str(i.revision.date_created),
'user': str(i.revision.user),
'object': i.object_repr,
'field': i.revision.comment.split(' ')[-1],
'new_value_field': str(i.field_dict),
'type': i.content_type.name,
'comment': i.revision.comment
})
data_ser = json.dumps(data)
return HttpResponse(data_ser, content_type="application/json")
当我 运行 上述代码片段时,我得到输出 json 作为
[{"type": "fruits", "field": "colour", "object": "anyobject", "user": "anyuser", "new_value_field": "{'price': , 'weight': 2kgs, 'colour': 'red'}", "comment": "Changed colour."}]
从上面的函数中,
'comment': i.revision.comment
returns json as "comment": "changed colour" 颜色是我在函数中写的字段,用于从评论中检索它 as
'field': i.revision.comment.split(' ')[-1]
但我认为从 field_dict 获取字段名和值是更好的方法
问题:我想从上面的json列表中过滤new_field_value和old_value。在new_filed_value中只有颜色值。
获取更改的字段并不像查看评论那么容易,因为这可以被覆盖。
Django-reversion
只负责 存储 每个版本,而不是比较。
您最好的选择是查看 django-reversion-compare
module 及其 admin.py
代码。
其中的大部分代码旨在生成一个整洁的并排 HTML 差异页面,但代码应该能够重新用于生成每个更改字段的列表对象(因为每个版本可以有多个更改的字段)。
代码应该*包括一种独立于视图的方式来在某个时候获取更改的字段,但这应该让你开始:
from reversion_compare.admin import CompareObjects
from reversion.revisions import default_revision_manager
def changed_fields(obj, version1, version2):
"""
Create a generic html diff from the obj between version1 and version2:
A diff of every changes field values.
This method should be overwritten, to create a nice diff view
coordinated with the model.
"""
diff = []
# Create a list of all normal fields and append many-to-many fields
fields = [field for field in obj._meta.fields]
concrete_model = obj._meta.concrete_model
fields += concrete_model._meta.many_to_many
# This gathers the related reverse ForeignKey fields, so we can do ManyToOne compares
reverse_fields = []
# From:
changed_fields = []
for field_name in obj._meta.get_all_field_names():
f = getattr(
obj._meta.get_field_by_name(field_name)[0],
'field',
None
)
if isinstance(f, models.ForeignKey) and f not in fields:
reverse_fields.append(f.rel)
fields += reverse_fields
for field in fields:
try:
field_name = field.name
except:
# is a reverse FK field
field_name = field.field_name
is_reversed = field in reverse_fields
obj_compare = CompareObjects(field, field_name, obj, version1, version2, default_revision_manager, is_reversed)
if obj_compare.changed():
changed_fields.append(field)
return changed_fields
然后可以这样调用:
changed_fields(MyModel,history_list_item1, history_list_item2)
其中 history_list_item1
和 history_list_item2
对应各种实际 Version
项目。
*:作为投稿人,我会说到做到的。
我有一个函数,其中 returns json 数据作为 reversion.models.
版本的历史记录from django.http import HttpResponse
from reversion.models import Version
from django.contrib.admin.models import LogEntry
import json
def history_list(request):
history_list = Version.objects.all().order_by('-revision__date_created')
data = []
for i in history_list:
data.append({
'date_time': str(i.revision.date_created),
'user': str(i.revision.user),
'object': i.object_repr,
'field': i.revision.comment.split(' ')[-1],
'new_value_field': str(i.field_dict),
'type': i.content_type.name,
'comment': i.revision.comment
})
data_ser = json.dumps(data)
return HttpResponse(data_ser, content_type="application/json")
当我 运行 上述代码片段时,我得到输出 json 作为
[{"type": "fruits", "field": "colour", "object": "anyobject", "user": "anyuser", "new_value_field": "{'price': , 'weight': 2kgs, 'colour': 'red'}", "comment": "Changed colour."}]
从上面的函数中,
'comment': i.revision.comment
returns json as "comment": "changed colour" 颜色是我在函数中写的字段,用于从评论中检索它 as
'field': i.revision.comment.split(' ')[-1]
但我认为从 field_dict 获取字段名和值是更好的方法
问题:我想从上面的json列表中过滤new_field_value和old_value。在new_filed_value中只有颜色值。
获取更改的字段并不像查看评论那么容易,因为这可以被覆盖。
Django-reversion
只负责 存储 每个版本,而不是比较。
您最好的选择是查看 django-reversion-compare
module 及其 admin.py
代码。
其中的大部分代码旨在生成一个整洁的并排 HTML 差异页面,但代码应该能够重新用于生成每个更改字段的列表对象(因为每个版本可以有多个更改的字段)。
代码应该*包括一种独立于视图的方式来在某个时候获取更改的字段,但这应该让你开始:
from reversion_compare.admin import CompareObjects
from reversion.revisions import default_revision_manager
def changed_fields(obj, version1, version2):
"""
Create a generic html diff from the obj between version1 and version2:
A diff of every changes field values.
This method should be overwritten, to create a nice diff view
coordinated with the model.
"""
diff = []
# Create a list of all normal fields and append many-to-many fields
fields = [field for field in obj._meta.fields]
concrete_model = obj._meta.concrete_model
fields += concrete_model._meta.many_to_many
# This gathers the related reverse ForeignKey fields, so we can do ManyToOne compares
reverse_fields = []
# From:
changed_fields = []
for field_name in obj._meta.get_all_field_names():
f = getattr(
obj._meta.get_field_by_name(field_name)[0],
'field',
None
)
if isinstance(f, models.ForeignKey) and f not in fields:
reverse_fields.append(f.rel)
fields += reverse_fields
for field in fields:
try:
field_name = field.name
except:
# is a reverse FK field
field_name = field.field_name
is_reversed = field in reverse_fields
obj_compare = CompareObjects(field, field_name, obj, version1, version2, default_revision_manager, is_reversed)
if obj_compare.changed():
changed_fields.append(field)
return changed_fields
然后可以这样调用:
changed_fields(MyModel,history_list_item1, history_list_item2)
其中 history_list_item1
和 history_list_item2
对应各种实际 Version
项目。
*:作为投稿人,我会说到做到的。