您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Django Deliciousp高级过滤:如何使用Q对象进行复杂的查找

Django Deliciousp高级过滤:如何使用Q对象进行复杂的查找

你走在正确的轨道上。但是,build_filters应该将资源查找转换为ORM查找。

认实现将查询关键字基于__key_bits,值对进行拆分,然后尝试查找所查找资源与其等效ORM之间的映射。

你的代码不应仅在此处构建过滤器。这是一个改进的固定版本:

def build_filters(self, filters=None):
    if filters is None:
        filters = {}
    orm_filters = super(BusinessResource, self).build_filters(filters)

    if('query' in filters):
        query = filters['query']
        qset = (
                Q(name__icontains=query) |
                Q(description__icontains=query) |
                Q(email__icontains=query)
                )
        orm_filters.update({'custom': qset})

    return orm_filters

def apply_filters(self, request, applicable_filters):
    if 'custom' in applicable_filters:
        custom = applicable_filters.pop('custom')
    else:
        custom = None

    semi_filtered = super(BusinessResource, self).apply_filters(request, applicable_filters)

    return semi_filtered.filter(custom) if custom else semi_filtered

因为你使用的是Q对象,所以标准apply_filters方法不够聪明,无法应用你的自定义过滤器键(因为没有键),但是你可以快速覆盖它并添加一个名为“ custom”的特殊过滤器。这样,你build_filters可以找到一个合适的过滤器,构造它的含义,并将其作为自定义传递给apply_filters,后者将直接应用它,而不是尝试从字典中将其值作为一个项目拆包。

Go 2022/1/1 18:19:45 有404人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶