14

この質問では SQLの逆演算の問題が解決されLIKEました。たとえば、フィールド名が「Peter Johnson」の場合、次のようなクエリで見つけることができます。

select name from user where "Mr. Peter Johnson" like CONCAT('%', name, '%')

DjangoQオブジェクトでそのようなことを行う方法はありますか(私は大きなクエリを作成しているので、生のSQLクエリを使用するのは合理的ではありません)?

4

4 に答える 4

3

残念ながら、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 に依存しないアプリを作成する必要があります...

于 2014-10-27T20:38:43.563 に答える
-3
output = MyModel.objects.filter(Q(name__contains="Mr. Peter Johnson"))
于 2013-03-18T07:59:17.883 に答える