django - 在 RESTfull 资源中按所有者过滤项目的最佳实践

标签 django angularjs rest django-rest-framework

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

我遇到了一个我想不出最佳解决方案的问题。

目前我有这个:

/api/planned-meals?from=2014-3-18&to=2014-3-28

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

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

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

/api/planned-meals?from=2014-3-18&to=2014-3-28&user=self

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

这是我目前在 Django 中的 View :

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”,您只需查询所有者 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 View 中:

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 - 在 RESTfull 资源中按所有者过滤项目的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656825/

相关文章:

python - 如何在 django 中创建唯一的 URL?

python - FileNotFoundError at/stores/- 将本地 json 文件加载到 Django View 中

rest - 学习服务器 RESTful 代码的最佳方式是什么?

javascript - 从 JavaScript 发布到 Chatter

python - 在 Django 中使用 Markdown 时出错

django-allauth 不保存社交信息

javascript - 如何以 Angular 从 iframe 获取 HTML

angularjs - Angular 文件上的 Gulp 任务中断

angularjs - splice() 元素时完成 ng-repeat 的 Angular 指令

java - 如何授权对我的 GAE REST 服务器的请求?