按 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_at
和 created_by
属性。我添加了几个属性来简化访问这些属性的历史记录,如下所示:
@property
def created_date(self):
return self.history.earliest().history_date
@property
def created_by(self):
return self.history.earliest().history_user
这在我处理实例时工作正常。现在,当我尝试按 history_date
或 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
无法解决,但它说明了(我希望)我想要达到的目的。
有没有人以这种方式使用过 Simple History,他们是否可以在正确的方向上推动我解决这个问题?在这一点上,我正在考虑用适当的字段替换我的 created_by
和 created_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
)
)
我创建了一个使用 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_at
和 created_by
属性。我添加了几个属性来简化访问这些属性的历史记录,如下所示:
@property
def created_date(self):
return self.history.earliest().history_date
@property
def created_by(self):
return self.history.earliest().history_user
这在我处理实例时工作正常。现在,当我尝试按 history_date
或 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
无法解决,但它说明了(我希望)我想要达到的目的。
有没有人以这种方式使用过 Simple History,他们是否可以在正确的方向上推动我解决这个问题?在这一点上,我正在考虑用适当的字段替换我的 created_by
和 created_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
)
)