0

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

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_dateor过滤查询集时遇到了问题history_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无法解决,但它说明了(我希望)我想要达到的目标。

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

4

1 回答 1

0

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

如果有人想看看对我有用的东西:

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
    )
)
于 2019-12-06T21:10:11.650 回答