Django 在RESTfull资源中获取由所有者筛选的项目的最佳实践

Django 在RESTfull资源中获取由所有者筛选的项目的最佳实践,django,angularjs,rest,django-rest-framework,Django,Angularjs,Rest,Django Rest Framework,我使用django作为后端,并使用AngularJS从我的RESTfull端点提取 我遇到了一个问题,我想不出最好的解决办法 目前我有: /api/计划膳食?从2014年3月18日至2014年3月28日 这给了我这两个日期之间的所有项目 但是我希望能够从当前请求的用户那里获取这两个日期之间的所有项目,但是在调用资源时我不知道用户的id。但在后端,我可以将所有者设置为当前请求的用户 创建另一个参数表示用户应该是当前请求的用户,这是一种不好的做法。可能是这样的: /api/计划膳食?起始日期=201

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

我遇到了一个问题,我想不出最好的解决办法

目前我有:

/api/计划膳食?从2014年3月18日至2014年3月28日

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

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

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

/api/计划膳食?起始日期=2014-3-18&to=2014-3-28&user=self

还是创建另一个总是返回请求用户是所有者的项目的资源更好

这是我目前在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

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

我认为你可以双向选择,但你必须考虑几件事

您可以对“QUERY_PARAMS”进行筛选,当为“self”时,您只需查询owner request.user或用户名,但当然,用户名不能是名为“self”的用户,否则您将有一个边缘大小写

如果您决定为此创建自己的端点,可以这样做,创建所需数量的过滤器,如:

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
        ....
        ....

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

我想看看如何在django中处理会话。也许我应该补充一点,我仍然希望能够从所有用户那里获取项目,并按用户进行过滤。你好,Javier谢谢你的回答。我最终得到了一个新的端点,我给它进行了身份验证,用于获取特定的用户项,还有一个用于列出所有项。我认为这很好,因为它实际上提高了安全性。。。顺便说一句,如果你可以的话,我对答案投赞成票会很酷;)