获取RESTful资源中所有者筛选的项目的最佳实践

时间:2014-05-14 13:58:41

标签: django angularjs rest django-rest-framework

我使用django作为后端,并使用AngularJS从我的RESTfull端点提取。

我遇到了一个我无法找到最佳解决方案的问题。

目前我有这个:

  

/ API /计划餐从2014年3月18日=&安培;至2014年3月28日=

给出了这两个日期之间的所有项目。

但是我希望能够从当前请求的用户获取这两个日期之间的所有项目,但是当我调用资源时我不知道用户的ID。但在后端我可以将所有者设置为当前请求的用户。

创建另一个表示用户应该是当前请求用户的参数是不好的做法。它可能像:

  

/ API /计划餐从2014年3月18日=&安培;至2014年3月28日=&安培;用户=自

或者更好的做法是创建另一个始终返回请求用户所有者的项目的资源吗?

这是我目前在Django的观点:

class PlannedMealList(generics.ListCreateAPIView):
    serializer_class = PlannedMealSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def get_queryset(self):
        """
        Overiding the queryset if some parameters isset
        """
        queryset = PlannedMeal.objects.all()
        date_from = self.request.QUERY_PARAMS.get('from', None)
        date_to = self.request.QUERY_PARAMS.get('to', None)
        if date_from is not None and date_to is not None:
            queryset = queryset.filter(date__gte=date_from).filter(date__lte=date_to)
        return queryset

    def pre_save(self, obj):
        obj.user = self.request.user

我希望你能帮助我,或者至少给我一些关于最佳实践的想法?

1 个答案:

答案 0 :(得分:3)

我认为你可以双管齐下,但你必须考虑几件事情。

您可以为" QUERY_PARAMS"进行过滤。什么时候是"自我"你只是查询所有者的request.user或用户的名字,但当然,不能有一个名为" self"对于用户名或您将有一个边缘案例

如果您决定为此创建自己的endPoint,可以这样做,根据需要创建尽可能多的过滤器:

from rest_framework import filters

class OwnerFilterBackend(filters.BaseFilterBackend):
    """
    Filter that request user view his own objects
    """
    def filter_queryset(self, request, queryset, view):
        """
        :param request: HTTP Request
        :param queryset: View QuerySet
        :param view: View Instance
        :return: QuerySet filter by the user request as the owner
        """
        return queryset.filter(owner=request.user)

然后只需将过滤器添加到新的api视图中:

class PlannedMealList(generics.ListCreateAPIView):
    serializer_class = PlannedMealSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    filter_backends = (OwnerFilterBackend,)
    ....
    ....

您可以应用多个过滤器,例如日期或订购,这将有助于保持干燥

应用许多过滤器的示例

class PlannedMealList(generics.ListCreateAPIView):
        serializer_class = PlannedMealSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
        filter_backends = (OwnerFilterBackend, filters.DjangoFilterBackend, filters.OrderingFilter)
        filter_class = MyFilterClass
        ....
        ....

如果您还有其他问题,我可以帮助您;)