无法使用年份和月份过滤查询集

时间:2020-02-23 10:11:47

标签: python django python-3.x

我的模特是:

class Procedure(models.Model):
    procid = models.AutoField(primary_key=True, unique=True)
    timestr = models.DateTimeField(default=timezone.now)
    template = models.ForeignKey(ProcedureTemplate, on_delete=models.CASCADE, blank=True, null=True)
    clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    doctor = models.ForeignKey(doctor, on_delete=models.SET_NULL, blank=True, null=True)
    customer = models.ForeignKey(customer, on_delete=models.CASCADE, null=False)

我正在尝试按年份和月份过滤模型属性上的查询集。

如果我按年份过滤:

procedures = Procedure.objects.filter(clinic = clinicobj, timestr__year=2020)
for proc in procedures:
    print(f'{proc.pk} {proc.timestr}')

我得到:

66 2020-01-08 12:38:37.237585+00:00
67 2020-01-11 15:40:00.344492+00:00
68 2020-01-12 04:50:56.190794+00:00
69 2020-01-26 05:58:36.962205+00:00
70 2020-01-29 09:51:59.038017+00:00
71 2020-02-01 14:24:18.921779+00:00
72 2020-02-09 06:20:30.993496+00:00
73 2020-02-15 10:23:09.068201+00:00
74 2020-02-15 14:04:29.368066+00:00
75 2020-02-16 06:25:09.702327+00:00
76 2020-02-19 14:05:19.369457+00:00
77 2020-02-20 11:13:35.934392+00:00

但是,当我尝试通过增加月份来缩小范围时,没有任何结果。怎么了?

Procedure.objects.filter(clinic = clinicobj, timestr__year=2020, timestr__month=2)

<QuerySet []>

Procedure.objects.filter(clinic = clinicobj, timestr__year=2020).filter(clinic = clinicobj, timestr__month=2)

<QuerySet []>

2 个答案:

答案 0 :(得分:1)

取决于文档

“当USE_TZ为True时,日期时间字段将在过滤之前转换为当前时区。这需要数据库中的时区定义。”

因此,如果您使用mysql,则可以安装pytz并使用mysql_tzinfo_to_sql加载时区表。

您还可以在django中关注databases document。希望对您有所帮助。

答案 1 :(得分:0)

切换为使用public onStepBegin(begin: Observable<any>): Observable<MyContext> { return begin.pipe( switchMap(() => this.context.loadInitial), tap((c) => { this.context.configurations = c; }), ); ,并建议您检查用于保存日期时间值的时区。

使用USE_TZ = True。使用(timezone.make_aware(value))转换日期时间

Extract*

结果

from django.db.models.functions import ExtractMonth, ExtractYear


procedures = (
    Procedure.objects
    .annotate(
        year=ExtractYear('timestr'), 
        month=ExtractMonth('timestr'),
    )
    .filter(
        clinic=clinicobj, 
        year=2020, 
        month=2,
    )
)
for proc in procedures:
    print(f'{proc.pk} {proc.timestr}')