首页 > 解决方案 > Django extra + where:如何转义标识符

问题描述

extra在 Django 中有一个带有where子句的过滤器,但表名是动态的。

filtered_queryset = queryset.extra(
    where=[
        f'({table_name}.modified_on, {table_name}.id) > (%s, %s)',
    ],
    params=(after_ts, after_id),
)

我怎样才能最好地避免 f-string 以确保它不对 SQL 注入开放?

我希望 SQL 进行元组比较,而不是多重>>=with AND。从之前的测试来看,它似乎更有可能使用多列索引。

(这是一些自定义分页代码的一部分,其中光标本质上是一个日期时间和 id 的元组)

标签: pythonsqldjangopostgresqlsql-injection

解决方案


为什么不把它写成过滤器呢?

filtered_queryset = queryset.filter(
    Q(modified_on__gt=after_ts) |
    Q(Q(modified_on__gte=after_ts) & Q(id__gt=after_id))
)

PS:有点不清楚您的查询要做什么,我认为是这样,但也许您想过滤其他内容。


推荐阅读