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"
            ]
        ]
    },
    ...
]

Вернуться на верх