如何在Django rest框架中将DateTime作为null进行过滤?

2024-03-29 05:51:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想用Django rest框架构建过滤API。一个字段是datetime2。我想筛选具有空值datetime2的记录

这是我的模特

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()

url.py

path('productprice/', ProductPriceViewSet.as_view({'get':'list','post':'create'}), name="product-price"), 

这使我很容易实现分页、过滤和排序。 但我有一个问题。我需要筛选ruleend中具有空值的记录

enter image description here

空值的有效日期/时间是多少?或者我应该添加一些东西到我的后端


Tags: pytruefields记录paginationclass空值serializer
2条回答

您需要在ProductPriceSerializer中添加此行ruleend = fields.DateField(input_formats=['%Y-%m-%dT%H:%M:%S.%fZ']),以便通过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']

更新: 用于筛选ruleend中具有空值的记录。您只需要像下面这样覆盖列表方法:

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)

我找到了最好的答案。我可以使用客户过滤器

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”

enter image description here

我希望这能帮助其他和我面临同样问题的人

相关问题 更多 >