【问题标题】:Filtering Objects in a View in Django - Oscar?在 Django 中过滤视图中的对象 - Oscar?
【发布时间】:2015-11-06 04:21:40
【问题描述】:

尝试在 Django-Oscar 中对 ProductCategoryView 实现一个简单的排序查询。实现起来应该相当简单,但是要花太多时间来理解。我正在重新考虑是否继续与奥斯卡合作,因为它似乎难以扩展。

ProductCategoryView 返回某个类别的产品。我想根据产品型号中的某些字段对它们进行排序,比如price。首先,我将父泛型类从TemplateView 更改为ListView,以便我可以使用get_queryset 方法。然后我如下重写get_queryset 方法并在其中编写一个简单的查询集。 虽然流程确实进入了 get_queryset 方法,但仍然没有进行排序。

def get_queryset(self):
        queryset = Product.objects.filter(categories = self.category)
        logger.debug("inside")
        queryset = queryset.order_by("price")           
        return queryset

那么我必须覆盖哪些方法。每次编辑奥斯卡都会有这么多麻烦还是我错过了什么?

P.S:我最近问了很多关于 Django/Oscar Class based view 的问题。所以我可能看起来像Help Vampire。如果是这种情况,请忽略这个问题。

【问题讨论】:

  • 我认为您最好通过在目录search_handlers(例如SimpleProductSearchHandler)中自定义适当的类来进行此更改...我认为您必须对视图进行重大更改是一个迹象,表明它是错误的地方来尝试做出这种改变。我发现 Oscar 设计精良且高度可扩展,但不幸的是,文档完全缺乏为您指出很多事情的正确方向
  • 谢谢,短暂的喘息。会尝试回来。

标签: python django django-oscar


【解决方案1】:

@Anentropic 是对的,但让我详细说明一下。

Oscar 的所有浏览视图都基于搜索引擎,因此可以使用分面来缩小返回的产品列表。默认情况下,有 SolrElasticsearch 的搜索引擎集成。

如果您不使用 Solr 或 Elasticsearch,则默认实现是 SimpleProductSearchHandler。它不使用任何外部服务,而是使用calls Product.browsable.get_queryset()。该代码位于oscar.apps.catalogue.managers 中,可以定制以提供自定义排序。

这一切都假设您不想使用搜索引擎,因为更改其他搜索处理程序类的结果顺序所需的自定义是后端特定的。

【讨论】:

  • 感谢您的详细说明。我在SimpleProductSearchHandler 中添加了我的order_by 子句并且它起作用了。我认为一旦我掌握了奥斯卡的窍门,事情就会变得容易。你能指出一些比官方文档更好地解释奥斯卡细节的博客或文档吗?
  • 很遗憾,我唯一的知识来自第一手经验。
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2014-01-08
  • 2022-10-05
相关资源
最近更新 更多