微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。