2013-04-13 67 views
1

我有图片上传的模型,看起来是这样的:Django/Python:如何按日期对查询集结果进行分组?

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') 

但后来我又怎能组他们一天公布?(假设他没有每天发布,只在某些日子发布)

函数将不得不返回所有图像组。

+1

你看过这个问题吗? http://stackoverflow.com/questions/629551/how-to-query-as-group-by-in-django –

+0

不,我没有,这绝对解决了我的问题的前半部分。这里,'upload_date'字段是一个datetime.datetime对象,这意味着没有两个upload_date值是相同的。我只想按日期分组,而不是按时间分组。我会怎么做? – sgarza62

+0

我认为你必须使用'.extra()',你不能'.order_by()'在一个datetimefield上不幸:( –

回答

4

为什么你不按以下方式做?

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_dates是一家集joes_images的日期,你会得到joes_images_separated作为字典(键是日期,值对每个日期的joes_images列表)。

我很抱歉有点脏的代码。我认为这是有效的。供你参考。

+0

你不需要2个for循环在'upload_dates'中去掉'for d'并且if语句只是构造'joes_images'中每个图像的日期键'd' – rawbeans

相关问题