Python Django Admin和DRF API中的加载速度非常慢
我有一个拥有1100万个实例的模型(当我在少量数据上测试模型时没有问题)模型没有任何外键或许多字段。当我尝试用我的模型(DRFAPI或Django Admin)加载页面时,页面加载大约5-7分钟,整个系统也开始减速。当我与其他模型一起工作时,没有这样的问题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_
型号:
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