2

私が構築しているアプリケーションでは、より高いレベルの API を持つ一連のカスタム モデル マネージャーとクエリセットを作成しました。

管理アクションを実行すると問題が発生します。渡されたクエリセットは一般的なもののようです。カスタムクエリセットにアクセスして、作成したフィルタリング関数を使用できるようにしたいと考えています。

これはアクションです:

def mark_payment_as_sent_action():
    ''' Admin action to mark payment as sent '''

    def mark_payment_as_sent(modeladmin, request, queryset):

        # #####################################################################
        # This is what I currently do
        payments = queryset.filter(status=models.Payment.S_PENDING)

        # This is what I want to do
        payments = queryset.pending()
        # #####################################################################

        # Do stuff with filtered payments

        return HttpResponseRedirect("...")

    mark_payment_as_sent.short_description = "Mark as sent"
    return mark_payment_as_sent

カスタム モデル マネージャーとクエリ セットは次のとおりです。

class PaymentQuerySet(models.query.QuerySet):

    def pending(self):
        return self.filter(status=self.model.S_PENDING)

class PaymentManager(models.Manager):
    use_for_related_fields = True

    def get_query_set(self):
        return PaymentQuerySet(self.model)

    def pending(self, *args, **kwargs):
        return self.get_query_set().pending(*args, **kwargs)

そして最後に、モデルと管理クラス:

class Payment(models.Model):

    status = models.CharField(
        max_length=25,
        choices=((S_PENDING, 'Pending'), ...)
    )

    objects = managers.PaymentManager()

@admin.register(models.Payment)
class PaymentsAdmin(admin.ModelAdmin):

    actions = (
        admin_actions.mark_payment_as_sent_action(),
    )

管理アクションを呼び出すときにクエリセットを使用するように Django に指示する方法についてのヒントはありますか?

どうもありがとう。

4

1 に答える 1