我使用 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/