在两个条件下过滤Django数据库中的元素



我想在两个条件下从Django数据库中选择元素-布尔值"使用";是真的,并且无论";dateUsed";是在过去20天内。然而,我当前的filter语句返回一个空的QuerySet,即使应该有满足这两个条件的元素。我过滤元素是否正确?我已经附上了过滤元素的代码,我的模型的定义,以及改变"值的代码块;使用";一旦模型元素显示在我的网站上。

过滤器:

def pastSongs(request):
window = datetime.now().date() - timedelta(days=20)
songHistory = Song.objects.filter(used = True).filter(dateUsed__gt = window)
ent = {}
ent["ent"] =  songHistory
return render(request, 'rollingStone/songs.html',ent)

型号:

class Song(models.Model):
rank = models.IntegerField()
artist = models.CharField(max_length=100)
title = models.CharField(max_length=100)
cover = models.URLField()
writers = models.CharField(max_length=100)
producers = models.CharField(max_length=100)
releaseInfo = models.CharField(max_length=100)
description = models.TextField(max_length=3000)
used = models.BooleanField(default=False)
dateUsed = models.DateField(auto_now=True)

改变";使用";字段:

def reload():
# Change status of old song/album to used, and save the date that it was used
if entry["status"] == "filled":
currentSong = Songs.objects.get(entry["songEnt"].name)
currentAlbum = Albums.objects.get(entry["albumEnt"].name)
currentSong.dateUsed = datetime.now().date() - timedelta(days=1)
currentAlbum.dateUsed = datetime.now().date() - timedelta(days=1)
currentSong.used = True
currentAlbum.used = True
currentSong.save()
currentAlbum.save()

您的问题可能是您对窗口日期做了一些奇怪的事情。。。

除此之外,你可以为你的模型写一个经理:

managers.py:

from django.db.models import QuerySet, Q
SongQuerySet(QuerySet):
def used_and_in_time_window(time_window):
return self.filter(Q(used=True) & Q(dateUsed__gte=time_window))

models.py:

class Song(models.Model):
rank = models.IntegerField()
artist = models.CharField(max_length=100)
title = models.CharField(max_length=100)
cover = models.URLField()
writers = models.CharField(max_length=100)
producers = models.CharField(max_length=100)
releaseInfo = models.CharField(max_length=100)
description = models.TextField(max_length=3000)
used = models.BooleanField(default=False)
dateUsed = models.DateField(auto_now=True)

objects = SongQuerySet.as_manager()

用法:

def pastSongs(request):
time_window = datetime.date(datetime.now()) - timedelta(days=20)
songHistory = Song.objects.used_and_in_time_window(time_window)
ent = {}
ent["ent"] =  songHistory
return render(request, 'rollingStone/songs.html',ent)

此外,您可能希望将时间增量值打包到一个环境变量中,这样,如果您想在将来更改时间增量值,就不必进行提交。

最新更新