【问题标题】:django listview pagination is too slow on large datasetdjango listview 分页在大型数据集上太慢
【发布时间】:2021-09-14 23:06:57
【问题描述】:

我有一个 django 列表视图,它显示来自目录的过滤数据。在小型数据库上可以正常工作,但是当数据库太大时,返回结果需要很长时间。

views.py:

class all_ads(generic.ListView):
    paginate_by = 12
    template_name = 'new_list_view_grid-card.html'

    def get_queryset(self):
        city_district = self.request.GET.getlist('city_district')
        usage = self.request.GET.get('usage')
        status = self.request.GET.get('status')
        last2week = datetime.datetime.now() - datetime.timedelta(days=14)
        status = status.split(',')
        if usage:
            usage = usage.split(',')
        else:
            usage = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
        intersections = list(set(status).intersection(usage))
        type_q = (Q(type__in=intersections) & Q(type__isnull=False))

        cat_ids = list(models.Catalogue.objects.filter(
                Q(*[Q(city__contains=x) for x in city_district], _connector=Q.OR) |
                Q(*[Q(district__contains=x) for x in city_district], _connector=Q.OR)
            ).values_list('pk', flat=True))

            result = models.Catalogue.objects.filter(
                Q(datetime__gte=last2week),
                type_q,
                pk__in=cat_ids
            ).distinct().order_by('-datetime').prefetch_related('type')

        return result

models.py:

class Catalogue(models.Model):
    city = models.CharField(db_index=True,max_length=100, null=True)
    district = models.CharField(db_index=True,max_length=100, null=True)
    type = models.ManyToManyField(Type, db_index=True)


class Type(models.Model):
    name = models.CharField(max_length=100, db_index=True)

    def __str__(self):
        return self.name

这是template.html:

{% for Catalogue in catalogue_list %}
    "do something"
{% endfor %}

【问题讨论】:

    标签: django listview pagination


    【解决方案1】:

    您也可以决定通过前端来完成,即获取所有数据,将其发送到前端并使用 JavaScript 显示

    【讨论】:

    • 我想在后端做
    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2023-04-04
    • 2017-02-07
    相关资源
    最近更新 更多