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

2024-05-14 13:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

就像在标题中一样,我希望得到两个日期字段(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)

我做错了什么?你知道吗


Tags: 实例模型truedatetimemodelsnulllengthnow
3条回答

问题出在你所做的查询集中! 怎么会有比现在更大的东西存在呢日期时间.now那么结束日期呢日期时间。现在? 尝试反转gte和lte!你知道吗

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

首先,请仔细检查数据库中是否有条目,并且使用的数据库是否正确(不要使用没有条目的dev/staging/production环境)。你知道吗

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

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

开始日期必须小于现在,结束日期必须大于现在。只有到那时“现在”才会在两者之间。你知道吗

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

对于django,最好从django.utils导入timezone,然后使用timezone.now()而不是内置的datetime模块。你知道吗

问题似乎是代码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)

相关问题 更多 >

    热门问题