2017-10-19 6 views
2

Je souhaite créer une fonction de classe qui renvoie le résultat d'un filtre, mais je souhaite pouvoir l'utiliser comme si la fonction était également un filtre django:Comment passer les arguments du filtre Django en tant qu'arguments à une autre fonction

C'est ce que j'ai essayé:

def section_set_with_compound(self, *args, **kwargs): 
    print args 
    print kwargs 
    return self.section_set.filter(Q(args) |Q(course__is_compound=True)) 

Mais im obtiens une erreur comme si args et kwags sont vides:

Je veux être en mesure de le faire:

myobject.section_set_with_compound(param1=1,param2__param3__=x,param4__icontains="ha..") 

Comment puis-je accomplir ceci?

+0

Utilisez: 'Q (** kwargs)' – schwobaseggl

+0

Mais vous n'utilisez pas 'kwargs' dans votre filtre. –

Répondre

1

Vous devez utiliser l'astérisque et double astérisque (*) dans l'appel à Q ainsi:

def section_set_with_compound(self, *args, **kwargs): 
    return self.section_set.filter(Q(*args, **kwargs) | Q(course__is_compound=True))

Le args est un tuple avec les anonymes paramètres, kwargs est un dictionnaire avec les paramètres nommés. Mais au cas où vous voudriez les passer à nouveau comme des paramètres sans nom et nommés, vous devez également faire un appel avec l'astérisque.

Notez que là, vous avez construit un logique OU, cela signifie que les éléments doivent ou satisfaire le filtre avec les arguments que vous travaillez, ou le course__is_compound est True (ou les deux en même temps) .

Si vous voulez un logique ET, vous pouvez utiliser:

def section_set_with_compound(self, *args, **kwargs): 
    return self.section_set.filter(*args, course__is_compound=True, **kwargs)

maintenant Django filtrer les lignes de telle sorte que toutes les conditions que vous entrez en attente, et le course__is_compound est réglé sur True. C'est sémantiquement différent par rapport au premier fragment de code.