Как восстановить все строки группового элемента в DJANGO?

Моя база данных связана с недвижимостью, и у меня есть история сделок с недвижимостью. У меня есть такой код:

` def filter_model(estate, years=[], exact_match=False, distance_km=None): query_filter = Q(location__postal_code__isnull=False, sold_histories__isnull=False)

        if distance_km:
            query_filter &= Q(location__point__distance_lte=(
                estate.location.point, distance_km))
            query_filter &= Q(type=estate.type)
            query_filter &= Q(square_feet__isnull=False)  # >1500
            query_filter &= Q(year_built__isnull=False)
            if estate.type == 2:
                address = str(estate.location.address).split('#')[0].strip()
                query_filter &= Q(location__address__icontains=address)

            estates = Estate.objects.prefetch_related(
                # ? This is for speed up loop.
                'location__city',
                'location__neighbourhood',
                Prefetch('sold_histories', queryset=SoldHistory.objects.order_by('-date'))
            ).filter(query_filter).distinct()
        else:
            if len(years) == 2:
                query_filter &= Q(sold_histories__date__year=years[0])

            if exact_match:
                query_filter &= Q(location__city__province__id=estate.location.city.province.id)
            else:
                query_filter &= Q(location__city__id=estate.location.city.id)

            estates = Estate.objects.prefetch_related(
                # ? This is for speed up loop.
                'location__city',
                'location__neighbourhood',
                Prefetch('sold_histories', queryset=SoldHistory.objects.filter(date__year__in=years))
            ).filter(query_filter).filter(sold_histories__date__year=years[1]).distinct()

        return [
            [
                e.id,
                e.bedrooms,
                e.type,
                e.year_built,
                e.square_feet,
                e.lot_size,
                e.location.id,
                e.location.address,
                e.location.postal_code,
                e.location.latitude,
                e.location.longitude,
                e.location.city.name if e.location.city else None,
                e.location.neighbourhood.name if e.location.neighbourhood else None,
                sh.date,
                sh.price
            ]
            for e in estates
            for sh in e.sold_histories.all()
        ]`

Мне нужно оптимизировать этот код, причина, по которой я составил список, заключается в том, что мне нужно вернуть всю историю адреса из базы данных. Я использую этот код для получения данных,

km = 1 * 1000 estates_by_km.extend(filter_model(estate=estate, distance_km=km//2))

Если я не буду возвращать список, то будет возвращена только последняя история по каждому адресу. Есть ли способ вернуть всю историю отфильтрованного адреса без создания списка?

Этот код работает правильно, мне нужно только оптимизировать его.

Является ли создание списка значительным накладным расходом по сравнению с запросом к базе данных?

Если вы хотите обрабатывать итемы из кверисета по одному, вы можете превратить эту функцию в функцию-генератор Python. Последняя часть будет выглядеть так

for e in estates:
    for sh in e.sold_histories.all()
       yield [
          e.id,
          ...
          sh.price
       ]

, а код вызова будет

for item in filter_model( estate, other_args...):
    # do something with item, which is a simple list as yield'ed.
    e_id = item[0]
    ...

Я бы либо предоставил дикту, а не список, либо определил бы символические имена для индексов в списке ( E_ID=0, E_BEDROOMS = 1, ... и т. д.), и в обоих случаях это устраняет большое количество возможностей для ошибок. (Для ОП я полагаю, что это обучение бабушки сосать яйца, но другие могут прочитать это).

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