当 kwargs else return all 时应用 Django 过滤器

Django filter applied when kwargs else return all

我想显示所有 Team 对象的列表,或者缩小到仅显示与通过 kwarg 参数传递的 country 相关的对象。

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)

我可以轻松实现过滤,但是对于没有参数而不是所有对象我得到 None。

我当然知道,我可以 return super()...all() 而不是 filter() 但这看起来很难看,我想问一下是否有像 __all__ 这样的魔法关键字,或者我应该给一些 Q 对象但是如何准备它?

您可以过滤:

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

    def get_queryset(self):
        qs = super().get_queryset()
        <strong>if 'country' in self.kwargs</strong>:
            return qs.filter(country=self.kwargs['country'])
        return qs  # 🖘 otherwise return the entire queryset