Django-simple-history: Как оптимизировать диффинг истории?
Я использую djangorestframework
для отображения истории модели, наряду с тем, какие поля были изменены.
Для добавления history
в мои модели, HistoricalRecords
наследуется через modelmixin
, как показано в docs.
Все работает нормально, но у меня много similar queries (10)
и duplicate queries (2)
.
Есть ли возможный способ оптимизировать эту логику (у меня нет вариантов)?
// viewsets.py
class BaseHistoryModelViewset(viewsets.ModelViewSet):
""" Inherit this class to add path '.../history/' to your viewset """
@action(methods=["get"], detail=False, url_path="history")
def results_history(self, request, *args, **kwargs):
if "simple_history" in settings.INSTALLED_APPS:
qs = self.queryset
class HistoryModelSerializer(serializers.ModelSerializer):
list_changes = serializers.SerializerMethodField()
def get_list_changes(self, obj):
# Optimize this logic here.
if obj.prev_record:
delta = obj.diff_against(obj.prev_record)
for change in delta.changes:
yield change.field, change.old, change.new
return None
class Meta:
model = qs.model.history.model
fields = ["history_id", "history_date", "history_user",
"get_history_type_display", "list_changes"]
serializer = HistoryModelSerializer(
qs.model.history.all(), many=True)
return Response(serializer.data)
return Response(status=status.HTTP_404_NOT_FOUND)
// output
[
{
"history_id": 6,
"history_date": "2022-12-04T15:15:09.533340Z",
"history_user": 2,
"get_history_type_display": "Changed",
"list_changes": [
[
"last_login",
null,
"2022-12-04T15:15:09.516601Z"
]
]
},
...
]