Search code examples
djangodjango-modelsdjango-generic-views

Django filter applied when kwargs else return all


I would like to display list of all Team objects or narrow to only those related to country passed via kwarg parameter.

class TeamListView(ListView):
    """View to display all or filtered teams."""
    model = Team

    def get_queryset(self):
        filters = {}
        country = self.kwargs['country'] if 'country' in self.kwargs else None
        filters.update({ 'country': country })
        return super(TeamListView, self).get_queryset() \
            .filter(**filters)

I can easilly achieve filtering but for no parameter instead of all objects I get None.

Of course I know, I can return super()...all() instead of filter() but that looks ugly and I'm asking if there's any magic keyword like __all__ or I should give some Q object but how to prepare it?


Solution

  • You can filter with:

    class TeamListView(ListView):
        """View to display all or filtered teams."""
        model = Team
    
        def get_queryset(self):
            qs = super().get_queryset()
            if 'country' in self.kwargs:
                return qs.filter(country=self.kwargs['country'])
            return qs  # 🖘 otherwise return the entire queryset