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

Django REST Framework How to Efficiently Filter Calculate Model property

我有一个 属性 的 is_expired 模型,通过将当前时间与另一个名为 Saas_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

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

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, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)