Django date lookup 查詢不到數(shù)據(jù)解決方法

問題描述

最近在使用 Django 的時(shí)候,發(fā)現(xiàn) DateTimeField__date__range 查詢不到數(shù)據(jù)瞳秽。

class FootPrint(models.Model):
    """
    我的足跡
    """
    goodsbase = models.ForeignKey(GoodsBase, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    visited_at = models.DateTimeField(
        auto_now_add=True,
        help_text="訪問時(shí)間",
        verbose_name="訪問時(shí)間"
    )

end_date = datetime.now().date()
start_date = end_date - timedelta(days=30)

queryset = FootPrint.objects.filter(
    user_id=user_id,
    visited_at__date__range=[start_date, end_date],
).order_by('-visited_at')

我想查詢某個(gè)用戶30天之內(nèi)的訪問足跡蹦疑,但是傳入正確的條件蚓挤,卻總是查詢不出數(shù)據(jù)。

問題排查及解決

首先我通過原生 SQL 直接查詢數(shù)據(jù)庫车份,發(fā)現(xiàn)能查詢到結(jié)果谋减,排除條件及 MySQL DATA 函數(shù)的問題。

SELECT * FROM `footprints_footprint` WHERE (`user_id` = 1 AND DATE(`visited_at`) BETWEEN '2019-07-22' AND '2019-08-21');

我打印 Django orm 生成的 SQL 語句扫沼,發(fā)現(xiàn) DATE 部分如下:

 DATE(CONVERT_TZ(`footprints_footprint`.`visited_at`, 'UTC', 'Asia/Shanghai')) BETWEEN '2019-07-22' AND '2019-08-21')

到這里出爹,可以猜測問題出在 CONVERT_TZ 函數(shù)上。查詢 MySQL 官方文檔缎除,發(fā)現(xiàn) CONVERT_TZ 有兩種傳參方式严就,一種是時(shí)區(qū)名,如上面 Django 生成的 SQL 語句器罐。另一種是直接寫時(shí)差梢为。

SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');

MySQL 默認(rèn)是不支持寫時(shí)區(qū)名的,如需支持時(shí)區(qū)名方式轰坊,需執(zhí)行如下命令

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

執(zhí)行完上面的命令铸董,發(fā)現(xiàn)就能正常查詢出數(shù)據(jù)了。

雜談

問題解決了肴沫,但是有一個(gè)限制粟害。如果將代碼部署到其他機(jī)器,又還得執(zhí)行一遍上面的命令颤芬”可以將 range 查詢方式優(yōu)化為大于小于比較。

end_date = datetime.now()
start_date = end_date - timedelta(days=30)

queryset = FootPrint.objects.filter(
    user_id=user_id,
    visited_at__gte=start_date, 
    visited_at_lte=end_date,
).order_by('-visited_at')

如果仍查詢不到數(shù)據(jù)站蝠,請確保你的 TIME_ZONEUSE_TZ設(shè)置正確汰具。參考 Django Time zones。在中國菱魔,數(shù)據(jù)庫使用 MySQL留荔,這兩個(gè)值應(yīng)該設(shè)置如下:

TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

如果仍想用 range 方式,可以自定義 lookup

from django.db.models import Lookup

from django.db.models import DateTimeField, DateField


class DateEqLookup(Lookup):
    """
    自定義 lookup豌习,解決Django __date 轉(zhuǎn)換時(shí)區(qū)默認(rèn)用時(shí)區(qū)名存谎,而 MySQL 默認(rèn)不支持
    """

    lookup_name = 'date_eq'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)

        params = lhs_params + rhs_params
        return f'DATE({(lhs, rhs)}) = DATE({params})'

DateField.register_lookup(DateEqLookup)
DateTimeField.register_lookup(DateEqLookup)

不過 lookup 方式不太靈活拔疚,需確保查詢之前 lookup 正確被注冊肥隆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稚失,隨后出現(xiàn)的幾起案子栋艳,更是在濱河造成了極大的恐慌,老刑警劉巖句各,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吸占,死亡現(xiàn)場離奇詭異晴叨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矾屯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門兼蕊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人件蚕,你說我怎么就攤上這事孙技。” “怎么了排作?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵牵啦,是天一觀的道長。 經(jīng)常有香客問我妄痪,道長哈雏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任衫生,我火速辦了婚禮裳瘪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罪针。我一直安慰自己盹愚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布站故。 她就那樣靜靜地躺著皆怕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪西篓。 梳的紋絲不亂的頭發(fā)上愈腾,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音岂津,去河邊找鬼虱黄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吮成,可吹牛的內(nèi)容都是我干的橱乱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼粱甫,長吁一口氣:“原來是場噩夢啊……” “哼泳叠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茶宵,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤危纫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體种蝶,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡契耿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃征。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搪桂。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盯滚,靈堂內(nèi)的尸體忽然破棺而出锅棕,到底是詐尸還是另有隱情,我是刑警寧澤淌山,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布裸燎,位于F島的核電站,受9級特大地震影響泼疑,放射性物質(zhì)發(fā)生泄漏德绿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一退渗、第九天 我趴在偏房一處隱蔽的房頂上張望移稳。 院中可真熱鬧,春花似錦会油、人聲如沸个粱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽都许。三九已至,卻和暖如春嫂冻,著一層夾襖步出監(jiān)牢的瞬間胶征,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工桨仿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睛低,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓服傍,卻偏偏與公主長得像钱雷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吹零,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容