我希望将我的查询集的结果按月分组,并将月份名称作为每个表的标题。
我有一个这样的模型:
class Tenant(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
telephone = models.CharField(max_length=30)
email = models.CharField(max_length=30)
contract_end = models.DateField(blank=False)
def __str__(self):
return u'%s %s' % (self.first_name, self.last_name)如下图所示:
def expired_contracts(request):
now = datetime.datetime.now()
tenant_queryset = Tenant.objects.all()
expired_list = []
for x in range(0, 12):
date = now + relativedelta(months=x)
expired = tenant_queryset.filter(
contract_end__year=date.year,
contract_end__month=date.month
)
expired_list += expired
context = {"expired_list": expired_list}
return render(request, "expired_template.html", context)模板:
{% for tenant in expired_list %}
<table>
<tr>
<td>{{ tenant.first_name }}</td>
<td>{{ tenant.telephone }}</td>
<td>{{ tenant.contract_end }}</td>
</tr>
</table>
{% endfor %}我想我可以创建一堆空列表,并用循环和if语句填充它们,但这似乎有点多。
有没有别的办法可以让我这么做呢?
谢谢!
发布于 2017-03-12 21:51:10
itertools.groupby()是一个对列表进行分组的优秀工具。
首先,您应该根据要分组的属性对对象进行排序
tenant_queryset = Tenant.objects.order_by('contract_end')按月分组可以通过使用itertools.groupby并将日期格式化为字符串date.strftime('%B')来实现
context = {
"expired_list": itertools.groupby(
expired_list,
lambda t: t.contract_end.strftime('%B')
)
}然后,您可以遍历模板中的月份和该月的租户,如下所示
{% for month, tenants in expired_list %}
<h3>{{ month }}</h3>
<table>
{% for tenant in tenants %}
<tr>
<td>{{ tenant.first_name }}</td>
<td>{{ tenant.telephone }}</td>
<td>{{ tenant.contract_end }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}https://stackoverflow.com/questions/42746067
复制相似问题