Django REST Framework如何有效过滤计算模型属性

问题描述

我有is_expired的模型属性,该属性通过将当前时间与另一个称为True的字段进行比较而简单地返回FalseSaas_expire_date

 @ property
    def is_expired(self):
        current_time = timezone.Now()
        return current_time > self.saas_expire_date

如何有效地对此进行过滤。.我担心使用For循环会严重影响响应时间,尤其是在有大量数据的情况下

class StorePublicAPI(APIView):
    """
    Store API for client side
    """

    def get(self,request):
        """
        `Get Stores`
        """
        raw_stores = Store.objects.filter(
            is_approved=True,is_active=True)
        stores = []
        for store in raw_stores:
            if not store.is_expired:
                stores.append(store)

        serializer = StorePublicSerializer(stores,many=True)
        return Response(serializer.data,status=status.HTTP_200_OK)

或者,如果您找到一种更有效的方法来计算用户是否已付款,可以帮我吗? Saas_expire_date字段何时达到当前日期时间

解决方法

不确定自己的saas_expire_date是什么样子,但是假设它是DateField或DateTimeField,则可以使用an lte filter过滤Store模型,如下所示:

class StorePublicAPI(APIView):
    """
    Store API for client side
    """

    def get(self,request):
        """
        `Get Stores`
        """
        stores = Store.objects.filter(
            saas_expire_date__lte=timezone.now(),is_approved=True,is_active=True)

        serializer = StorePublicSerializer(stores,many=True)
        return Response(serializer.data,status=status.HTTP_200_OK)

请确保正确实施了时区配置,否则可能会遇到几个小时的时间将对象退还的问题。检查文档中的时区here

,

实际上,您正在为saas_expiry_date属性中的is_expired字段进行时间过滤。为什么不在过滤器中也这样做呢?

class StorePublicAPI(APIView):
    """
    Store API for client side
    """

    def get(self,request):
        """
        `Get Stores`
        """
        current_time = timezone.now()
        queryset = Store.objects.filter(
            is_approved= True,is_active=True,saas_expire_date__lt=current_time,)

        serializer = StorePublicSerializer(queryset,status=status.HTTP_200_OK)