Django QuerySet:按“值LIKE列”过滤

时间:2019-05-20 10:01:54

标签: python django django-orm

我有一个SQL查询来确定与给定输入字符串匹配的最长匹配前缀。用例是查找呼叫给定目的地的费率,该费率由数据库中的多行确定。最具体的匹配前缀是要使用的前缀。

因此在原始SQL中,它看起来像这样:

$this->Auth->authenticate['Token'] = array(
                'fields' => array(
                ),
                // 'parameter' => '_token',
                'header' => 'AuthenticationToken',
                'scope' => array(
                    'User.permission_api_login' => true
                )
        );

在上面的示例中,目标位置是3212345789。在实际的应用程序中,这是由缓存机制和更多内容支持的,但最终要归结于此。

我想在我们的Django项目中完成相同的API调用,并且我知道我也可以在其中使用原始SQL,但是我想知道在Django中是否有一种方法可以使用“ queryset-language”

我对此感到困惑:

SELECT * FROM rateplan_rates
WHERE '3212345789' LIKE CONCAT(prefix, '%')
ORDER BY CHAR_LENGTH(prefix) DESC LIMIT 1

缺少的部分当然是RateplanRate.objects \ .annotate(prefix_length=Length('prefix'), prefix_match=Concat('prefix', '%')) \ .filter('search_value LIKE prefix_match') \ .order_by('-prefix_length')[0:1] 。这是可能的还是我应该退回到原始SQL?

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找类似icontainscontains

的东西

例如

RateplanRate.objects.filter(field__icontains='foobar')