更正查询集以获取两个日期字段之间的模型实例

时间:2018-01-30 06:02:23

标签: python django

在标题中,我希望获取两个日期字段(startdateenddate)之间的所有模型实例。

这是我的模型的实现:

class HonorKegiatan(models.Model):
     id = models.AutoField(primary_key=True)
     jenisKegiatan = models.CharField(max_length=100, null=True, choices=masterkegiatan)
     honor = models.IntegerField(null=True, blank=True)
     keterangan = models.CharField(max_length=100, null=True, blank=True)
     startdate= models.DateField(null=True)
     enddate= models.DateField(null=True)

我想显示我的模型的实例,其中datetime.datetime.now()位于startdate和enddate字段之间。

我必须如何编写查询集?

这是我迄今为止尝试过的,但没有任何结果:

honor = HonorKegiatan.objects.filter(
    startdate__gte=datetime.datetime.now(),
    enddate__lte=datetime.datetime.now()
).values_list('honor',flat=True)

我做错了什么?

3 个答案:

答案 0 :(得分:0)

首先请仔细检查您是否确实在数据库中有条目并且您正在使用正确的数据库(不使用没有条目的dev / staging / production环境)。

您的过滤代码有问题,应该是这样的:

honor = HonorKegiatan.objects.filter(startdate__lt=datetime.datetime.now(),enddate__gt=datetime.datetime.now()).values_list('honor',flat=True)

startdate需要低于现在,并且结束时间比现在更长。只有这样"现在"介于两者之间。

您将lte与enddate和gte与startdate一起使用,这是问题所在。如果你想要在两者之间,最好不要在两端都使用相等的。我更新了代码以使用gtlt代替。

使用django,最好从timezone导入django.utils,然后使用timezone.now()代替内置的datetime模块。

答案 1 :(得分:0)

问题似乎是代码startdate__gte=datetime.datetime.now(),enddate__lte=datetime.datetime.now()

在这里,您尝试将模态中可能不存在的值与当前时间值进行比较。此外,代码编写得不好,您应首先设置比较变量的值,然后在过滤器中使用。

可能的修正

starttime = datetime.datetime.now() - datetime.timedelta(days=1)
starttime = starttime.replace(hour=0, minute=0, second=0, microsecond=0)
endtime = datetime.datetime.now()
honor = HonorKegiatan.objects.filter(startdate__gte=startdate, enddate__lte=enddate).values_list('honor',flat=True)

答案 2 :(得分:0)

问题出在您所做的查询集中! 怎么可能存在比datetime.now和enddate更接近starttime的东西然后datetime.now? 尝试颠倒gte和lte!

honor = HonorKegiatan.objects.filter(
    startdate__lte=datetime.datetime.now(),
    enddate__gte=datetime.datetime.now()
).values_list('honor',flat=True)