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

注意事项:

  • 我不能extra(select=...)用来将字段转换为字符串然后过滤它,filter(..)因为 django 不支持它
  • 我不能使用extra(where=...),因为这会OR整个查询
  • 我无法创建ExtraWhere对象并将其与对象(|)Q
4

1 回答 1

3

我设法找到了解决方案。

我子类django.db.models.Q化并实现了该add_to_query(self, query, alias)方法。通过这种方式,我可以毫无问题地对 Q 进行ORAND 。

示例代码:

请注意,这只是一个简化版本,在这里只是为了给您一个想法。

你真的应该添加额外的位(例如支持链 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 回答