在找到一個解決方案,Django ORM order by exact的過程中,我創建自定義DJANGO FUNC:Django的自定義爲複雜的函數功能(SQL函數)
from django.db.models import Func
class Position(Func):
function = 'POSITION'
template = "%(function)s(LOWER('%(substring)s') in LOWER(%(expressions)s))"
template_sqlite = "instr(lower(%(expressions)s), lower('%(substring)s'))"
def __init__(self, expression, substring):
super(Position, self).__init__(expression, substring=substring)
def as_sqlite(self, compiler, connection):
return self.as_sql(compiler, connection, template=self.template_sqlite)
其工作原理如下:
class A(models.Model):
title = models.CharField(max_length=30)
data = ['Port 2', 'port 1', 'A port', 'Bport', 'Endport']
for title in data:
A.objects.create(title=title)
search = 'port'
qs = A.objects.filter(
title__icontains=search
).annotate(
pos=Position('title', search)
).order_by('pos').values_list('title', flat=True)
# result is
# ['Port 2', 'port 1', 'Bport', 'A port', 'Endport']
但作爲@hynekcer評論:
「這崩潰容易通過
') in '') from myapp_suburb; drop ...
預計該應用程序的名稱是「MYAPP並自動提交已啓用。」
的主要問題是,額外的數據(substring
)鑽進模板而不sqlescape這讓應用程序容易受到SQL注入式攻擊。
我無法找到哪個是Django的防護方法。
我創建了一個repo (djposfunc),您可以在其中測試任何解決方案。
對不起,我在本地回答了這個安全問題,然後等待解決問題。現在我寫了對原始問題的正常答案。 – hynekcer