0

我正在使用 django-simple-history 来记录我的模型中的活动。我的想法是有一个序列化程序来聚合所有模型的活动,并使用过滤器(每个模型和用户)显示这些信息。

像这样 的东西...api/history/?table=example&user=2...api/history/?table=another_example

楷模

class MyExampleModel(models.Model):
    ...
    history = HistoricalRecords()

class MyAnotherExampleModel(models.Model):
    ...
    history = HistoricalRecords()

串行器

class HistorySerializer():
    # with all records activities

意见

class HistoryViewSet():
    # with filter for model and user.
4

2 回答 2

1

是的,你可以这样做。这只是您希望在该序列化程序中拥有哪些数据以及您想要进行多少数据库查询的问题。

每个模型的历史记录都保存在一个单独的表中,因此如果您有n 个表,则需要n 个查询。为了找到您需要查询的所有管理器,您可以在视图中运行以下代码块:

from simple_history.exceptions import NotHistoricalModelError
from simple_history.utils import get_history_manager_for_model
from django.db import models

history_managers = []
for model in models.registered_models.values():
    # If you want to filter by which model you see, you could do that here. 
    try:
        history_managers.append(get_history_manager_for_model(model))
    except NotHistoricalModelError:
        continue

现在,使用您的 列表history_managers,您现在可以创建一个过滤历史对象列表以传递给您的序列化程序(假设此时您有一个user_id要过滤的对象,并且:

history_objects = []
for manager in history_managers:
    history_objects += list(manager.objects.filter(history_user_id=user_id))

serializer = MyHistorySerializer(history_objects, many=True)

就您希望如何构建该序列化程序而言,您只想使用在所有历史对象中一致的序列化程序字段,例如:

  • history_user_id
  • history_id
  • change_reason
  • history_date
于 2019-09-12T18:57:09.620 回答
0

你应该试试 django.apps.apps.get_models()。表格模式是“Historical MyExampleModel”

from django.apps import apps

class HistoryListApi(generics.ListAPIView):
    history_managers = []
    for model in apps.get_models():
        if 'Historical' in model._meta.object_name:
            history_managers.append(model)

    history_objects = []
     for manager in history_managers:
          history_objects += list(manager.objects.all())
于 2020-02-18T16:26:35.347 回答