#python #django #rest #pagination #backend
#python #django #rest #разбивка на страницы #серверная часть
Вопрос:
Я просто хочу создать API фильтрации с помощью Django rest framework. Одним полем является datetime2. Я хочу отфильтровать записи, которые имеют значение NULL как datetime2.
Вот мой models.py
ruleend = models.DateTimeField(db_column='RuleEnd', blank=True, null=True)
Вот мой serializer.py
class ProductPriceSerializer(serializers.ModelSerializer):
class Meta:
model = ProductPrice
fields = ['pricingruleid', 'productkey', 'productcode', 'customerid', 'customerchain', 'productpriceusd', 'rulestart', 'ruleend', 'creatorupn', 'created', 'customername', 'productdescription']
Вот views.py
class ProductPriceViewSet(viewsets.ModelViewSet):
serializer_class = ProductPriceSerializer
pagination_class = pagination.PageNumberPagination
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ['customerid', 'customername', 'productkey', 'productdescription', 'ruleend', 'rulestart']
ordering_fields = ['customerid', 'productkey', 'rulestart']
def get_queryset(self):
self.pagination_class.page_size_query_param = 'page_size'
return ProductPrice.objects.all()
urls.py
path('productprice/', ProductPriceViewSet.as_view({'get':'list','post':'create'}), name="product-price"),
Это позволяет мне очень легко реализовать разбивку на страницы, фильтрацию и сортировку.
Но у меня есть одна проблема. Мне нужно отфильтровать записи, которые имеют значение null в ruleend.
Какова действительная дата / время null? Или я должен добавить что-то в свой серверный сервер?
Комментарии:
1. можете ли вы попробовать не отправлять поле ruleend в запросе и посмотреть, что произойдет.
2. если я не отправляю поле ruleend, оно успешно извлекает данные. Но он не фильтрует поле ruleend.
Ответ №1:
Вам нужно добавить эту строку ruleend = fields.DateField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ'])
в ProductPriceSerializer для прохождения проверки с вашим вводом datetime:
from rest_framework import serializers, fields
class ProductPriceSerializer(serializers.ModelSerializer):
ruleend = fields.DateField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ'])
class Meta:
model = ProductPrice
fields = ['pricingruleid', 'productkey', 'productcode', 'customerid', 'customerchain', 'productpriceusd', 'rulestart', 'ruleend', 'creatorupn', 'created', 'customername', 'productdescription']
Обновлено:
Для фильтрации записей, имеющих значение null в ruleend. Вам просто нужно переопределить метод list следующим образом:
class ProductPriceViewSet(viewsets.ModelViewSet):
serializer_class = ProductPriceSerializer
pagination_class = pagination.PageNumberPagination
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ['customerid', 'customername', 'productkey', 'productdescription', 'ruleend', 'rulestart']
ordering_fields = ['customerid', 'productkey', 'rulestart']
def get_queryset(self):
self.pagination_class.page_size_query_param = 'page_size'
return ProductPrice.objects.all()
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
# Custom filter
ruleend = str(request.GET.get('ruleend', ''))
if ruleend.lower() == 'null':
queryset = queryset.filter(ruleend__isnull=True)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
Комментарии:
1. это подтвердит формат ввода поля ruleend. Я хочу отфильтровать нулевое значение. Это покажет ошибку проверки. И с помощью serializer я могу проверить поле, не добавляя эту строку.
2. Я понял, просто обновил свой ответ. Надеюсь, это поможет!
3. Спасибо, это имеет смысл.
4. Пожалуйста, помогите отметить мой ответ для других. Спасибо!
5. Я ищу другие методы. Я скоро опубликую этот ответ.
Ответ №2:
Я нашел лучший ответ. Я мог бы использовать фильтр customer.
from django_filters import rest_framework as restfilters
class ProductFilter(restfilters.FilterSet):
isrulendNull=restfilters.BooleanFilter(field_name='ruleend', lookup_expr='isnull')
class Meta:
model = ProductPrice
fields = ('customerid', 'customername', 'ruleend', 'productkey', 'productdescription', 'rulestart')
class ProductPriceViewSet(viewsets.ModelViewSet):
serializer_class = ProductPriceSerializer
pagination_class = pagination.PageNumberPagination
filter_backends = [DjangoFilterBackend, filters.OrderingFilter]
filterset_class = ProductFilter
# filterset_fields = ['customerid', 'customername', 'productkey', 'productdescription', 'ruleend', 'rulestart']
ordering_fields = ['customerid', 'productkey', 'rulestart']
def get_queryset(self):
self.pagination_class.page_size_query_param = 'page_size'
return ProductPrice.objects.all()
Я установил пользовательские поля ‘isrulendNull’.
Я надеюсь, что это поможет другим, кто сталкивается с той же проблемой, что и я.