【问题标题】:Django Generic View Model FilteringDjango 通用视图模型过滤
【发布时间】:2026-01-10 19:30:01
【问题描述】:

所以基本上我有这个从 ListView 继承的通用视图,我想要它做的是接受某种参数(如字符串或“选项”),然后根据这些参数过滤我的模型。

我已经找了两天了,似乎找不到太多关于这个的信息。我已经尝试过覆盖 get_queryset 函数,也只是尝试像这样直接过滤:

  model =  product.objects.filter(pk__in=[1,2,3,4,5])

但是大多数时候它只是给我这个错误:

/python3.5/site-packages/django/views/generic/list.py", line 38, in get_queryset

    queryset = self.model._default_manager.all()
AttributeError: 'QuerySet' object has no attribute '_default_manager'

我真的不需要“解决方案”,如果有人能指出我可以深入阅读的地方,我会很好,因为我只能找到基本的描述。

谢谢

【问题讨论】:

  • 你能添加更多关于你的模型的细节吗?
  • 什么是产品?那是模型名称还是变量名称。似乎产品是变量名(分配给查询集),在这种情况下它应该是 product.filter(pk__in=[1, 2, 3, 4, 5])
  • product 是模型的名称,"from .models import product"
  • 你试过model = product然后覆盖get_queryset()方法吗?显示上述错误是因为您已将 model 变量定义为 queryset
  • 谢谢!大声笑这比我想象的要容易得多,为什么我没有尝试将过滤器作为返回是因为我认为如果我覆盖了函数我必须编写整个函数+所以我注定要找到函数的原始定义但不能.

标签: django django-models django-generic-views


【解决方案1】:

在“views.py”中实现一个额外的函数来处理搜索

【讨论】:

【解决方案2】:

试试,

class YourView(ListView):
    model = product

    def get_queryset(self):
        queryset = super(YourView, self).get_queryset()
        #your condition here.
        return queryset.filter(pk__in=[1,2,3])

【讨论】:

  • 我现在已经这样做了: def get_queryset(self, **kwargs): return product.objects.filter(**kwargs) model = product 它似乎有效,是吗对超级(只是好奇)真的很重要吗?另外,我如何将 kwargs 发送到视图?像搜索字符串的参数还是只使用 post 方法更好?谢谢你的帮助! (编辑:身份在这条评论中搞砸了,哦,好吧......)
  • super() 调用只加载默认查询集。只调用父类方法只是惯例,您可以忽略它,但这实际上是一种很好的做法。然后,关于传递 kwargs,您可以编写您的 url 来获取特定模式并将其用作 kwarg,但这会很丑陋。但是,我个人建议编写一个自定义管理器来过滤查询集(仅当需要根据某些传递的 kwarg 进行过滤时)。
  • 嗯基本上我正在尝试建立一个商店,用户可以输入搜索字符串或检查不同的类别。如果这是 php,我想我会发布所有内容,然后只检查没有的值,然后构建查询。我决定涉足kwargs,因为我认为它更容易+我在文档中看到了这个“过滤器(**kwargs)。我有点想让它像一个unix命令,其中“ls”是视图,“-”(破折号)是选项或在这种情况下过滤。但是我不确定这是否是他们实现它的方式......我可能只需要做一个帖子或检查自定义管理器。
【解决方案3】:

把它分成两行:

model = Product

queryset = Product.objects.filter(pk__in=[1,2,3,4,5])

它会起作用的。

【讨论】:

  • 检查您的模型类,是 product 还是 Product 并使用该名称。按照惯例,我们使用CamelCase 上课。
最近更新 更多