1

Dans une application que je suis en train de construire, j'ai créé une série de gestionnaires de modèles personnalisés et de jeux de requête pour avoir une API de plus haut niveau.Comment définir une classe queryset personnalisée pour les actions d'administration Django?

Le problème survient lorsque j'exécute une action d'administration. Le jeu de requête qui lui a été transmis semble être générique, et j'aimerais avoir accès à mon jeu de requête personnalisé pour pouvoir utiliser les fonctions de filtrage que j'ai créées.

C'est l'action:

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 

Ce sont le gestionnaire de modèle personnalisé un ensemble de requête:

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) 

Et enfin les classes de modèle et d'administration:

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(), 
    ) 

Tout soupçon comment puis-je dire à Django d'utiliser mon jeu de requête lors d'une action d'administrateur?

Merci beaucoup.

+0

Qu'en est-redéfinissant la méthode [get_queryset] (https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset)? – noamk

+0

Lequel? La classe PaymentsAdmin? – jmoreno

+0

Oui. Aussi, juste remarqué le get_query_set au lieu de get_queryset dans votre gestionnaire. C'est probablement votre problème. – noamk

Répondre

0

Comme l'a noté noamk, le problème était le nom de la méthode. Django a renommé la méthode get_query_set en get_queryset.

Maintenant, il fonctionne petectly.

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()