如何为 Django 管理操作设置自定义查询集 class?
How to set a custom queryset class for Django admin actions?
在我正在构建的应用程序中,我创建了一系列自定义模型管理器和查询集以具有更高级别 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 在调用管理操作时使用我的查询集吗?
非常感谢。
正如 noamk 指出的那样,问题出在方法名称上。 Django 将 get_query_set
方法重命名为 get_queryset
.
现在一切正常。
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_queryset(self):
return PaymentQuerySet(self.model)
def pending(self):
return self.get_queryset().pending()
在我正在构建的应用程序中,我创建了一系列自定义模型管理器和查询集以具有更高级别 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 在调用管理操作时使用我的查询集吗?
非常感谢。
正如 noamk 指出的那样,问题出在方法名称上。 Django 将 get_query_set
方法重命名为 get_queryset
.
现在一切正常。
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_queryset(self):
return PaymentQuerySet(self.model)
def pending(self):
return self.get_queryset().pending()