Список прибывших, по годам

У меня есть эти три модели (я их обобщил):

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 in groupby(datas, attrgetter('year')) }
    # …

Здесь будет создан словарь, который сопоставляет год со списком Arrival объектов.

Вернуться на верх