【问题标题】:Filtering objects by year AND month of creation date按创建日期的年份和月份过滤对象
【发布时间】:2014-08-02 13:53:32
【问题描述】:

我在过滤对象时遇到问题。 在本地机器上正常运行的代码在服务器上不起作用。

这是用例: 我在 2014 年 7 月创建的数据库表中有多个对象。 我需要统计本月和本年创建的所有对象,所以我这样做:

number = Payment.objects.filter(time_created__year=year_created, time_created__month=month_created).count()+1

很遗憾,它总是返回 1,因为过滤不起作用,它找不到 7 月创建的对象。

当我尝试使用 shell 选择对象时:

Payment.objects.filter(time_created__year=2014, time_created__month=8)

返回[](无结果)。我试过了:

Payment.objects.filter(time_created__year=2014)

返回多个对象。所以我想选择第一个对象:

a = Payment.objects.filter(time_created__year=2014)[0]

并试图显示它的月份:

a.time_created.month

我很惊讶,因为它返回了8

你有什么想法,为什么我不能使用月份过滤对象?再说一次,它可以在本地机器上正常工作,但不能在生产主机上使用 linux。 p>

【问题讨论】:

  • 我的猜测是这与本地化有关,我认为它们在两台机器上都不同。还要检查docs.djangoproject.com/en/1.6/topics/i18n/timezones
  • 我虽然是这样,但上面的代码应该可以在 linux 机器上运行,但它不能。为什么单个对象的time_created.month 返回 8,而当我尝试使用此数字进行过滤时,我得到 0 个结果?
  • 按月过滤时是否得到结果?
  • 您是否为本地开发环境和生产服务器使用相同的后端?
  • 仅按月过滤时,我什么也得不到。

标签: django django-models django-orm


【解决方案1】:

您必须使用 Django 1.6.0 或更高版本,其中 USE_TZ = True 是其设置文件中的默认值,当您尝试检查 django 工具栏上的查询时,它将如下所示:

SELECT ... FROM `app_payment` WHERE EXTRACT(MONTH FROM CONVERT_TZ(`app_ayment`.`time_created`, 'UTC', 'Asia/Kolkata')) = 8);

返回空集。

所以要么安装 pytz使用 mysql_tzinfo_to_sql 加载时区表

pip install pytz
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u -p mysql

或简单地在您的设置文件中注释 USE_TZ = True 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2018-10-15
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多