我有这三个模型(我对它们进行了总结(:
class Tourist(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Etablissement(models.Model):
name = models.CharField(max_length=30)
class Arrival(models.Model):
tourist = models.ForeignKey(Tourist, on_delete=models.CASCADE)
place = models.ForeignKey(Etablissement, on_delete=models.CASCADE)
作为一名游客,我希望每年都有他所有的游客。我试过这个:
def detailTourist(request, id):
touriste = Tourist.objects.get(id=id)
datas = Arrival.objects.annotate(year=TruncYear('arrival_date')).values('year').annotate(total=Arrival.objects.filter(tourist=touriste)).order_by()
但它给了我一个错误:sub-select返回19列-预期为1(到达模型有19个字段,所以我很抱歉,这就是它说19的原因。
芬纳利,我该怎么做?
您可以使用itertools.groupby(…)
[Python doc]对项目进行分组,因为它已经按年份订购:
from itertools import groupby
from operator import attrgetter
def detailTourist(request, id):
datas = Arrival.objects.annotate(year=TruncYear('arrival_date')).order_by('year')
datas = { y: list(vs) for y, vs ingroupby(datas, attrgetter('year'))}
# …
在这里,它将创建一个字典,将一年映射到Arrival
对象的列表。