|
9 | 9 | from django.apps import apps
|
10 | 10 | from django.conf import settings
|
11 | 11 | from django.contrib import admin
|
| 12 | +from django.core.serializers import serialize |
12 | 13 | from django.db import models
|
13 | 14 | from django.db.models import Q
|
14 | 15 | from django.db.models.fields.proxy import OrderWrt
|
|
24 | 25 | from .manager import HistoryDescriptor
|
25 | 26 | from .signals import post_create_historical_record, pre_create_historical_record
|
26 | 27 |
|
| 28 | +import json |
| 29 | + |
27 | 30 | registered_models = {}
|
28 | 31 |
|
29 | 32 |
|
| 33 | +def model_to_dict(model): |
| 34 | + return json.loads(serialize("json", [model]))[0]["fields"] |
| 35 | + |
| 36 | + |
30 | 37 | def default_get_user(request, **kwargs):
|
31 | 38 | try:
|
32 | 39 | return request.user
|
@@ -461,18 +468,15 @@ def diff_against(self, old_history):
|
461 | 468 |
|
462 | 469 | changes = []
|
463 | 470 | changed_fields = []
|
464 |
| - instance_fields = [field.name for field in self.instance._meta.fields] |
465 |
| - old_instance_fields = [ |
466 |
| - field.name for field in old_history.instance._meta.fields |
467 |
| - ] |
468 |
| - for field in self._meta.fields: |
469 |
| - if field.name in instance_fields and field.name in old_instance_fields: |
470 |
| - old_value = getattr(old_history, field.name, "") |
471 |
| - new_value = getattr(self, field.name) |
| 471 | + old_values = model_to_dict(old_history.instance) |
| 472 | + current_values = model_to_dict(self.instance) |
| 473 | + for field, new_value in current_values.items(): |
| 474 | + if field in old_values: |
| 475 | + old_value = old_values[field] |
472 | 476 | if old_value != new_value:
|
473 |
| - change = ModelChange(field.name, old_value, new_value) |
| 477 | + change = ModelChange(field, old_value, new_value) |
474 | 478 | changes.append(change)
|
475 |
| - changed_fields.append(field.name) |
| 479 | + changed_fields.append(field) |
476 | 480 |
|
477 | 481 | return ModelDelta(changes, changed_fields, old_history, self)
|
478 | 482 |
|
|
0 commit comments