0

監査に Django Simple-History を使用する単純な Django データ モデルを作成しました。

from django.db import models

from simple_history.models import HistoricalRecords


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

history_dateDRY のために、Simple-History の&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_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解決できないため機能しませんが、私が取得しようとしていることを示しています (願っています)。

シンプルヒストリーをこのように使用した人はいますか? 彼らは、これを解決するために正しい方向に私を押してくれるでしょうか? この時点で、代替手段が見えないのでmycreated_byとproperties を適切なフィールドに置き換えることについて議論していますが、それは間違っていると感じています。created_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 に答える