2017-10-20 4 views
0

J'ai un ListView qui fait une liste d'articles, disons, des produits. Et je veux conditionnellement changer ce jeu de requête en envoyant un paramètre du modèle. Dites que je veux filtrer quelque chose sur supplier_id ou autre chose comme la date. Dois-je créer une nouvelle vue pour chaque situation ou l'extension de la base ListView Changin seulement mon queryset selon l'état ou je devrais utiliser un seul ListView et de traiter chaque situation en fonction de l'argument qui passe, siListView faisant un jeu de requête basé sur le paramètre

class ProductListView(ListView): 
... 
def get_queryset(self): 
     return Supplier.objects.all() 

class ProductBySupplierListView(ProductListView): 

def get_queryset(self): 
     return Supplier.objects.filter(supplier=self.kwargs['sup']) 

ou

class ProductListView(ListView): 
... 
def get_queryset(self): 
    if self.kwargs['sup']: 
     return Supplier.objects.filter(supplier=sup) 
    else: 
     return Supplier.objects.all().annotate(prd_cnt=Count('product')) 

Ou il peut y avoir un meilleur modèle pour gérer plusieurs problèmes de tri de conditions.

Je sais que je pourrais faire tout comme il est dit dans Filtering Objects in Class based view Django using Query parameters? mais est ce bon design ou je devrais préférer quelque chose d'autre, comme précité étendre et surcharger méthode queryset.

+0

Copie possible de [Filtrer les objets dans la vue basée sur la classe Django en utilisant les paramètres de requête?] (Https://stackoverflow.com/questions/31960428/filtering-objects-in-class-based-view-django-using-query- paramètres) – YPCrumble

+0

oui, mais je me demande est-ce que c'est juste du design standpoing? Maintenant, j'essaie d'étendre et de surcharger la méthode queryset chaque fois que j'en ai besoin et d'avoir un mapping séparé pour chaque condition de tri. – Dmitrii

+0

que voulez-vous dire par "une cartographie d'URL séparée"? La [réponse acceptée] (https://stackoverflow.com/a/31960938/2532070) est correcte du point de vue du design. Donc, votre deuxième façon de filtrer est correcte, à moins qu'il n'y ait quelque chose d'autre qui ne soit pas mentionné qui signifierait que le filtrage par fournisseur a besoin de sa propre vue sous-classée. – YPCrumble

Répondre

0

Il est difficile de dire lequel est le meilleur mais les deux approches fonctionnent. Quoi qu'il en soit, à la fin j'ai finalement trouvé une meilleure approche - est d'utiliser django-filtres, ce qui est fait pour le filtrage basé sur des critères.