2012-05-14 62 views
3

我有两个模型,如这些对象:组相同的字段值

class Schedule(models.Model): 
    name = models.CharField(_('name'), blank=True, max_length=15) 


class Day(models.Model): 
    DAYS_OF_THE_WEEK = (
     (0, _('Monday')), 
     (1, _('Tuesday')), 
     (2, _('Wednesday')), 
     (3, _('Thursday')), 
     (4, _('Friday')), 
     (5, _('Saturday')), 
     (6, _('Sunday')), 
    ) 
    schedule = models.ForeignKey(Schedule, blank=True, null=True, verbose_name=_('schedule')) 
    day = models.SmallIntegerField(_('day'), choices=DAYS_OF_THE_WEEK) 
    opening = models.TimeField(_('opening'), blank=True) 
    closing = models.TimeField(_('closing'), blank=True) 

这有可能是一个时间表可以像两日的对象,以便:

日(日程= 1天= 0,opening = datetime.time(7,30),closing = datetime.time(10,30)) Day(schedule = 1,day = 0,opening = datetime.time(12,30),closing = datetime。时间(15,30))

喜欢同一天的不同班次。

如果现在迭代他们我会得到0天的两个条目,像这样 [一天一天日程] [0,0,1,2,3,4,5,6]

如何创建一个查询集,以便将相同的日子分组在一起并保持其属性?

[day for day in schedule] 
[0 (two entries), 1, 3, 4, 5, 6] 

也许像

[id: [day], id: [day]] 

回答

5

我最终使用的代码是这样的:

from itertools import groupby 

day_set = store.schedule_set.all()[0].day_set.all() 
    schedule = dict() 
    for k, v in groupby(day_set, lambda x: x.day): 
     schedule[k] = list(v) 

和发送时间表模板进行渲染,这就像一个魅力。

+2

值得注意的是,这只适用于你的东西已经排序('groupby'只能删除相邻的重复元素)。当我第一次遇到它时,这种行为让我感到惊讶: - / – phooji

2

你可以将它们在模板级别,使用{% regroup %}{% for %} -loop与{% ifchanged %}标签。

在Python代码中使用groupby

+0

我忘了提及我不想在模板代码中使用它,而是因为它看起来很昂贵。但是你在itertools工具中通过groupby指引我。非常感谢! – panosl

相关问题