按 created/creator 过滤 Django Simple-History

Filtering Django Simple-History by created/creator

我创建了一个使用 Django Simple-History 进行审计的简单 Django 数据模型:

from django.db import models

from simple_history.models import HistoricalRecords


class AuditedModel(models.Model):
    history = HistoricalRecords(inherit=True)

为了 DRY,我试图利用 Simple-History 的 history_date & history_user 属性来代替添加 created_atcreated_by 属性。我添加了几个属性来简化访问这些属性的历史记录,如下所示:

    @property
    def created_date(self):
        return self.history.earliest().history_date

    @property
    def created_by(self):
        return self.history.earliest().history_user

这在我处理实例时工作正常。现在,当我尝试按 history_datehistory_user 过滤查询集时,我遇到了 运行 问题。例如,我可以通过以下方式过滤过去 24 小时内创建的对象:

queryset = AuditedModel.objects.all()

queryset.filter(
    uuid__in=AuditedModel.history.annotate(
        created_date=Min('history_date'),
    ).filter(
        created_date__gte=timezone.now() - relativedelta(days=1)
    ).values_list(
        'uuid', flat=True
    )
)

但是,我不知道如何通过多个属性过滤 AuditedModel。最终,我想获得一个包含由特定用户创建的新实例的查询集。

类似于:

queryset.filter(
    uuid__in=AuditedModel.history.annotate(
        created_date=Min('history_date'),
    ).filter(
        created_date__gte=timezone.now() - relativedelta(days=1)
    ).values_list(
        'uuid', flat=True
    ),
    history__history_user=request.user
)

这不起作用,因为 history 无法解决,但它说明了(我希望)我想要达到的目的。

有没有人以这种方式使用过 Simple History,他们是否可以在正确的方向上推动我解决这个问题?在这一点上,我正在考虑用适当的字段替换我的 created_bycreated_at 属性,因为我看不到替代方案,但感觉不对。

当然,在将我的问题发布到 Whosebug 后不久,我就意识到它是多么简单。

万一有人想看看对我有用的东西:

queryset.filter(
    uuid__in=AuditedModel.history.annotate(
        created_date=Min('history_date'),
    ).filter(
        created_date__gte=timezone.now() - relativedelta(days=1),
        history_user=request.user  # Filter by user here!
    ).values_list(
        'uuid', flat=True
    )
)