この質問では、 SQLの逆演算の問題が解決されLIKE
ました。たとえば、フィールド名が「Peter Johnson」の場合、次のようなクエリで見つけることができます。
select name from user where "Mr. Peter Johnson" like CONCAT('%', name, '%')
DjangoQ
オブジェクトでそのようなことを行う方法はありますか(私は大きなクエリを作成しているので、生のSQLクエリを使用するのは合理的ではありません)?
この質問では、 SQLの逆演算の問題が解決されLIKE
ました。たとえば、フィールド名が「Peter Johnson」の場合、次のようなクエリで見つけることができます。
select name from user where "Mr. Peter Johnson" like CONCAT('%', name, '%')
DjangoQ
オブジェクトでそのようなことを行う方法はありますか(私は大きなクエリを作成しているので、生のSQLクエリを使用するのは合理的ではありません)?
残念ながら、Django の ORM には逆 LIKE 用の機能が組み込まれていません。ただし、.extra()
句を使用すると、生のクエリよりも少し簡単になる場合があります。
私はこのようなものを使用しました:
qs.extra(
where=['''%s LIKE %s.%s'''],
params=(
"string to match",
FooModel._meta.db_table,
"bar_field",
),
)
上記のコードの問題は、
1) この形式の sqlite バックエンドでは機能しません (「. に近い構文エラー」、クエリでハードコードされたテーブル/列名で機能します... これは常に安全であるとは限らず、常に醜いです);
2) FooModel.bar_field にデータが必要な%in like style%
ので、任意の文字列に一致させることはできません (これは次のようなクエリで修正できます%s LIKE CONCAT("%", %s.%s, "%")
が、DBMS 固有のものになり、良くありません)。
逆 LIKE 自体は、おそらく主要な DBMS で動作するはずですが、sqlite と postgres でのみテストしました。
おそらく、誰かが私のソリューションを一般化し、この特定のタスク用に特別にサブクラス化されたクエリセット/マネージャー/Q オブジェクトを使用して、再利用可能な DBMS に依存しないアプリを作成する必要があります...
output = MyModel.objects.filter(Q(name__contains="Mr. Peter Johnson"))