1

タイトル失礼します。

to_char日時フィールドを文字列に変換しILIKE、クエリを作成しながらそれに適用するために(または同様のものを)使用する必要があります。

このようなもの:

SELECT ...

FROM mytable
WHERE 
    mytable.type = 'mytype'
 AND (
        mytable.name = 'myname' 
        OR 
        to_char(created_at, 'Mon DD, YYYY, MI:SS') ILIKE '%jun 27,%'
    )

ご覧のとおり、問題は、クエリのこの部分が一部のフィルターとORし、他のフィルターとANDする必要があることです。

考慮事項:

  • djangoがサポートしていないためextra(select=...)、フィールドを文字列に変換してからフィルタリングすることはできませんfilter(..)
  • クエリ全体でORextra(where=...)になるため、使用できません
  • オブジェクトを作成できず、オブジェクトExtraWhereOR (|)できませんQ
4

1 に答える 1

3

私は解決策を見つけることができました。

メソッドをサブクラス化django.db.models.Qして実装しましたadd_to_query(self, query, alias)。このようにして、Q を問題なくORおよびANDできます。

サンプルコード:

これは単純化されたバージョンであり、ここではアイデアを提供するだけであることに注意してください。

余分なビットを実際に追加する必要があります (たとえば、チェーン myobj_ my2ndobj _my3rdobj__mydatetime_field をサポートします)。

from django.db.models import Q
from django.db.models.sql.where import ExtraWhere, OR

class DatetimeQ(Q):
    def __init__(self, *args, **kwargs):
        super(DatetimeQ, self).__init__(*args, **kwargs)
        self.name = kwargs.get('name')
        self.value = kwargs.get('value')

    def add_to_query(self, query, alias):
        where = ExtraWhere(["to_char(" + self.name + ", %s) ILIKE %s"], [
                'Mon DD, YYYY, MI:SS', "%%%s%%" % self.value
            ])
        query.where.add(where, OR)

お役に立てれば。

于 2012-06-28T13:51:06.667 に答える