2016-02-12 102 views
1

在我正在构建的应用程序中,我创建了一系列自定义模型管理器和查询集以获得更高级别的API。如何为Django管理员操作设置自定义的queryset类?

当我执行管理员操作时,问题就出现了。传递给它的查询集似乎是通用的,我想访问我的自定义查询集以便能够使用我在其中创建的过滤函数。

这是操作:

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在调用管理操作时使用我的查询集?

非常感谢。

+0

约重写[get_queryset](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset)方法什么? – noamk

+0

哪一个? PaymentsAdmin课程? – jmoreno

+0

是的。另外,只需注意get_query_set而不是get_queryset。这可能是你的问题。 – noamk

回答

0

正如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() 
相关问题