Python Django Admin和DRF API中的加载速度非常慢

Python Django Admin和DRF API中的加载速度非常慢,python,django,python-3.x,django-rest-framework,Python,Django,Python 3.x,Django Rest Framework,我有一个拥有1100万个实例的模型(当我在少量数据上测试模型时没有问题)模型没有任何外键或许多字段。当我尝试用我的模型(DRFAPI或Django Admin)加载页面时,页面加载大约5-7分钟,整个系统也开始减速。当我与其他模型一起工作时,没有这样的问题 型号: class MyModel(models.Model): process_number = models.CharField(max_length=255, blank=True, null=True) order_

我有一个拥有1100万个实例的模型(当我在少量数据上测试模型时没有问题)模型没有任何外键或许多字段。当我尝试用我的模型(DRFAPI或Django Admin)加载页面时,页面加载大约5-7分钟,整个系统也开始减速。当我与其他模型一起工作时,没有这样的问题


型号:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

我用从另一个数据库获取数据的脚本填充了这个模型,因此没有像
unique=True
DB_index=True
这样的字段


查看:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

序列化程序:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

过滤器:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

分页器:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

管理员:

class MyModel(models.Model):
    process_number = models.CharField(max_length=255, blank=True, null=True)
    order_number = models.CharField(max_length=64, null=True, blank=True)
    dep_name_l1 = models.CharField(max_length=128, null=True, blank=True)
    worksite = models.CharField(max_length=64, null=True, blank=True)
    date_create = models.DateTimeField(null=True, blank=True)
    date_end = models.DateTimeField(null=True, blank=True)
    date_close = models.DateTimeField(null=True, blank=True)
    client_type = models.CharField(max_length=254, null=True, blank=True)
    account = models.CharField(max_length=32, null=True, blank=True)
    address_full = models.CharField(max_length=4000, null=True, blank=True)
    work = models.CharField(max_length=4000, null=True, blank=True)
    mark_value = models.IntegerField(null=True, blank=True)
    mark_by_serv = models.IntegerField(null=True, blank=True)
    mark_by_add = models.IntegerField(null=True, blank=True)
    area = models.CharField(max_length=4000, null=True, blank=True)
    building_type = models.CharField(max_length=2, null=True, blank=True)
    mrf_name = models.CharField(max_length=16, null=True, blank=True)
    filial = models.CharField(max_length=128, null=True, blank=True)
    order_status = models.CharField(max_length=128, null=True, blank=True)

    given_main_works_amount = models.FloatField(blank=True, null=True)
    checked_main_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_main_works = models.BooleanField(default=False)

    given_additional_works_amount = models.FloatField(blank=True, null=True)
    checked_additional_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_additional_works = models.BooleanField(default=False)

    calculated_all_works_amount = models.FloatField(blank=True, null=True)
    checked_all_works_amount = models.FloatField(blank=True, null=True)
    is_difference_of_all_works = models.BooleanField(default=False)

    is_matching_the_manual = models.BooleanField(default=False)
    comment = models.TextField(blank=True, null=True)
    logs = models.TextField(blank=True, null=True)
class MyModelView(
    mixins.RetrieveModelMixin, 
    mixins.ListModelMixin, 
    mixins.CreateModelMixin, 
    GenericViewSet
):
queryset = MyModel.objects.all().order_by('pk')
    serializer_class = MyModelSerializer
    filter_class = MyModelFilter
    filter_backends = (OrderingFilter, django_filters.rest_framework.DjangoFilterBackend, )
    pagination_class = ResultsSetPagination
class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'  # I know this is not the best practice
class MyModelFilter(django_filters.FilterSet):
    process_number = django_filters.Filter(name='process_number', lookup_expr='icontains')
    process_number_exact = django_filters.Filter(name='process_number', lookup_expr='exact')

    order_number = django_filters.Filter(name='order_number', lookup_expr='icontains')
    order_number_exact = django_filters.Filter(name='order_number', lookup_expr='exact')

    dep_name_l1 = django_filters.Filter(name='dep_name_l1', lookup_expr='icontains')
    dep_name_l1_exact = django_filters.Filter(name='dep_name_l1', lookup_expr='exact')

    worksite = django_filters.Filter(name='worksite', lookup_expr='icontains')
    worksite_exact = django_filters.Filter(name='worksite', lookup_expr='exact')

    date_create_gte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_create_lte = django_filters.DateFilter(name='date_create', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_end_gte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_end_lte = django_filters.DateFilter(name='date_end', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    date_close_gte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='gte')
    date_close_lte = django_filters.DateFilter(name='date_close', input_formats=['%Y-%m-%d'], lookup_expr='lte')

    client_type = django_filters.Filter(name='client_type', lookup_expr='icontains')
    client_type_exact = django_filters.Filter(name='client_type', lookup_expr='exact')

    account = django_filters.Filter(name='account', lookup_expr='icontains')
    account_exact = django_filters.Filter(name='account', lookup_expr='exact')

    order_status = django_filters.Filter(name='order_status', lookup_expr='icontains')
    order_status_exact = django_filters.Filter(name='order_status', lookup_expr='exact')

    filial = django_filters.Filter(name='filial', lookup_expr='icontains')
    filial_number_exact = django_filters.Filter(name='filial', lookup_expr='exact')

    mrf_name = django_filters.Filter(name='mrf_name', lookup_expr='icontains')
    mrf_name_exact = django_filters.Filter(name='mrf_name', lookup_expr='exact')

    is_difference_of_main_works = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='icontains')
    is_difference_of_main_works_exact = django_filters.Filter(name='is_difference_of_main_works', lookup_expr='exact')

    is_difference_of_additional_works = django_filters.Filter(
        name='is_difference_of_additional_works',
        lookup_expr='icontains'
    )
    is_difference_of_additional_works_exact = django_filters.Filter(
        name='is_difference_of_main_works',
        lookup_expr='exact'
    )

    is_difference_of_all_works = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='icontains'
    )
    is_difference_of_all_works_exact = django_filters.Filter(
        name='is_difference_of_all_works',
        lookup_expr='exact'
    )

    status = django_filters.Filter(name='status', lookup_expr='icontains')
    status_exact = django_filters.Filter(name='status', lookup_expr='exact')

    class Meta:
        model = MyModel
        fields = [
            'process_number',
            'order_number',
            'dep_name_l1',
            'worksite',
            'date_create',
            'date_end',
            'date_close',
            'client_type',
            'account',
            'order_status',
            'filial',
            'mrf_name',
            'is_difference_of_main_works',
            'is_difference_of_additional_works',
            'is_difference_of_all_works',
        ]
class ResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_paginated_response(self, data):
        next_page_number, previous_page_number = (None, None)
        if self.page.has_next():
            next_page_number = self.page.next_page_number()
        if self.page.has_previous():
            previous_page_number = self.page.previous_page_number()
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('current', self.page.number),
            ('next', next_page_number),
            ('previous', previous_page_number),
            ('page_size', self.page.paginator.per_page),
            ('results', data)
        ]))
admin.site.register(MyModel)

我试图删除过滤器,更改分页,只显示ID,但没有任何帮助。我认为问题在于大量的数据,尽管分页在这种情况下会有所帮助。谷歌只找到了关于优化关系模型的主题。我很高兴能得到任何帮助!谢谢

  • 平台:Ubuntu 18.04 LTS
  • Python版本:3.5.2
  • Django版本:1.11
  • DRF版本:3.6.2
  • DB:PostgreSQL
  • Postgres版本:psql主要版本9.5,服务器主要版本9.6

这是发生在您的本地开发机器还是生产机器上?在我的本地机器上您是否在本地db shell中尝试了select查询?如果你没有一个非常强大的硬件规范,它也应该会慢一些。我曾尝试在Django shell中通过ORM选择查询。请求也花了很长时间,而不是ORM外壳。我指的是实际的数据库外壳,例如mysql、postgres、sqlite等。它是发生在您本地的开发机器上还是发生在您的生产机器上?在我的本地机器上您是否在本地db外壳中尝试了select查询?如果你没有一个非常强大的硬件规范,它也应该会慢一些。我曾尝试在Django shell中通过ORM选择查询。请求也花了很长时间,而不是ORM外壳。我指的是实际的数据库外壳,例如mysql、postgres、sqlite等。