Django/Python:如何按日期对queryset结果进行分组?
我有一个上传图像的模型,看起来像这样:Django/Python:如何按日期对queryset结果进行分组?,python,django,datetime,django-models,Python,Django,Datetime,Django Models,我有一个上传图像的模型,看起来像这样: from django.db import models from django.contrib.auth.models import User import datetime class ImageItem(models.Model): user = models.ForeignKey(User) upload_date = models.DateTimeField(auto_now_add = True) last_modif
from django.db import models
from django.contrib.auth.models import User
import datetime
class ImageItem(models.Model):
user = models.ForeignKey(User)
upload_date = models.DateTimeField(auto_now_add = True)
last_modified = models.DateTimeField(auto_now = True)
original_img = models.ImageField(upload_to = img_get_file_path)
我想查询属于特定用户的ImageItem的所有实例,并根据上载的日期对它们进行分组。例如,对于某些用户,我想要一个2013年4月9日的组,另一个2013年4月12日的组,等等(假设他们在这些日期上载了一个或多个图像)
我想我运行一个简单的查询,比如
joes_images = ImageItem.objects.filter(user__username='joe')
那么,我怎样才能按发表的日期对它们进行分组呢?(假设他不是每天发表,只是在某些日子发表)
该函数必须返回所有图像组。为什么不执行以下操作
joes_images = ImageItem.objects.filter(user__username='joe') # your code
upload_dates = set([(i.year, i.month, i.day) for i in joes_images]) # set of upload_date
joes_images_separated = dict([(d, []) for d in upload_dates])
for d in upload_dates:
for i in joes_images:
if (i.year, i.month, i.day) == d:
joes_images_separated[d].append(i)
这里,upload\u dates
是joes\u images
中的一组日期,您可以将joes\u images\u分离为dict(键是日期,值是每个日期的joes\u images
)
我很抱歉有一点肮脏的代码。我认为这是可行的。供您参考。您为什么不做以下操作
joes_images = ImageItem.objects.filter(user__username='joe') # your code
upload_dates = set([(i.year, i.month, i.day) for i in joes_images]) # set of upload_date
joes_images_separated = dict([(d, []) for d in upload_dates])
for d in upload_dates:
for i in joes_images:
if (i.year, i.month, i.day) == d:
joes_images_separated[d].append(i)
这里,upload\u dates
是joes\u images
中的一组日期,您可以将joes\u images\u分离为dict(键是日期,值是每个日期的joes\u images
)
我很抱歉有一点肮脏的代码。我认为这是可行的。供您参考。您读过这个问题吗?不,我没有,这肯定解决了我问题的前半部分。这里,upload\u date
字段是一个datetime.datetime对象,这意味着没有两个upload\u date值是相同的。我想分组只根据日期,而不是时间。我该怎么做呢?我想你必须使用.extra()
来实现这一点,你不能.order\u by()
在datetimefield上。不幸的是:(你可以将它转换为datetimefield并使用它。例如,有一个字段用于分组,另一个字段用于执行任何其他操作。(这有点超级棒,但它可以工作)Ref,您可以在extra
中通过键入cast datetime to date来执行此操作
更清楚。你读过这个问题吗?没有,我没有,这肯定解决了我问题的前半部分。这里,upload\u date
字段是datetime.datetime对象,这意味着没有两个upload\u date值是相同的。我只想根据日期而不是时间进行分组。我该怎么做?我想你必须使用.extra()
为此,您不能在datetimefield上使用.order_by()
,不幸的是:(您可以将其转换为datetimefield并使用它。例如,有一个字段用于分组,另一个字段用于执行任何其他操作。(这有点超级棒,但它可以工作)Ref,您可以在extra
中通过键入cast datetime to date来执行此操作
更清晰。你不需要2个for循环。去掉upload\u dates:中d的和if语句,只需为joes\u images中的每个图像构建日期键d
,你不需要2个for循环。去掉upload\u dates:
中d的和if语句,只需构建日期键d
对于joes\u images