当前位置: 首页 > 面试题库 >

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

苗信鸥
2023-03-14
问题内容

我有一个基本的Django模型,例如:

class Business(models.Model):
    name = models.CharField(max_length=200, unique=True)
    email = models.EmailField()
    phone = models.CharField(max_length=40, blank=True, null=True)
    description = models.TextField(max_length=500)

我需要对上述模型执行复杂的查询,例如:

qset = (
    Q(name__icontains=query) |
    Q(description__icontains=query) |
    Q(email__icontains=query)
    )
results = Business.objects.filter(qset).distinct()

我已经尝试过以下使用法式饼的运气:

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']
        print query
        qset = (
                Q(name__icontains=query) |
                Q(description__icontains=query) |
                Q(email__icontains=query)
                )
        results = Business.objects.filter(qset).distinct()
        orm_filters = {'query__icontains': results}

    return orm_filters

在梅花类的Meta类中,我将过滤设置为:

filtering = {
        'name: ALL,
        'description': ALL,
        'email': ALL,
        'query': ['icontains',],
    }

关于如何解决这个问题有什么想法吗?


问题答案:

你走在正确的轨道上。但是,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,后者将直接应用它,而不是尝试从字典中将其值作为一个项目拆包。



 类似资料:
  • 问题内容: Iam使用 searchkick 库作为 Elasticsearch 客户进行产品搜索。 https://github.com/ankane/searchkick 可以创建“ OR”条件和“ AND”条件; AND操作 Product.search,其中:{价格:{lte:200},in_stock:true} 或操作 Product.search,其中:{或:[[{{in_stock

  • 我用这个函数从后端获取数据 和显示JSON,如下所示 我需要的是具有的数据,为此我创建 这部分代码显示为空。 请问如何使用

  • 问题内容: 我有2张桌子: 第一张桌子: 第二张表: 我需要1个 随机 从用户排它不是在 我正在使用此sql(没有rand): 表现还不错: 但是 性能却很糟糕:当我添加到最后时 我的洞很大,不能使用类似的东西 我尝试设置random ,例如: 但是也要花很多时间:( 如何获得性能不高的随机1个用户? 我认为我首先需要使用a进行筛选,然后对其进行过滤,但是我不知道该怎么做。 问题答案: 我有两个问

  • 问题内容: 我需要可以在mysql,postgres和其他主要DB上运行的联接的通用SQL查询。 我有一个名为三列的表:(所有整数)。 如何进行联接,以使我不按BETWEEN而是按JOIN来使用BUT? 像(伪): 如何将以上两个查询结合起来,得到以下结果: 我正在尝试在和上使用2个索引。如果我在上使用BETWEEN和/或复合索引,则仅使用开始索引,而不使用结束索引。现在请不要告诉我我错了。我只是

  • 主要内容:检测一个数字是否在一个范围内,实例,检测 IPv6 地址,实例,检测 URL - 必须包含QUERY_STRING(查询字符串),实例,移除 ASCII 值大于 127 的字符,实例,PHP 过滤器参考手册检测一个数字是否在一个范围内 以下实例使用了 filter_var() 函数来检测一个 INT 型的变量是否在 1 到 200 内: 实例 <?php $int = 122; $min = 1; $max = 200; if (filter_var($int, FILTER_VALI

  • 操作符(operator) 用来改变WHERE子句中的子句关键字,也成逻辑操作符。 AND操作符 通过使用AND来给WHERE子句附加条件。 索引出供应商'DLL01'制造且价格小于等于4美金的所有产品名称和价格。 mysql> SELECT prod_id, prod_price, prod_name -> FROM Products -> WHERE vend_id = 'D