如何从4.0之前的Django Rest Framework升级API并使RetrieveAPIView与多个PK一起使用

时间:2015-11-03 21:18:11

标签: django rest django-rest-framework

我正在从3.0之前的Django Rest Framework升级API。事实证明,这对于RetrieveAPIView来说是一场真正的斗争。

这是我的旧代码:

class ObjectLogLatest(generics.RetrieveAPIView):
    serializer_class = ObjectLogSerializer
    model = models.ObjectLog

    def get_queryset(self):
        model_one = self.kwargs['s_pk']
        model_two = self.kwargs['p_pk']
        user = self.request.user

        if self.request.user.is_superuser:
            try:
                return models.ObjectLog.objects.filter(model_one=model_one).filter(model_two=model_two).latest('created')
            except:
                pass
        else:
            try:
                return models.SolutionLog.objects.filter(user=self.request.user).filter(model_one=model_one).filter(model_two=model_two).latest('created')
            except:
                pass

这是我的新代码:

class MultipleFieldLookupMixin(object):
    """
    Apply this mixin to any view or viewset to get multiple field filtering
    based on a `lookup_fields` attribute, instead of the default single field filtering.
    """
    def get_object(self):
        queryset = self.get_queryset()             # Get the base queryset
        queryset = self.filter_queryset(queryset)  # Apply any filter backends
        filter = {}
        for field in self.lookup_fields:
            filter[field] = self.kwargs[field]
        return get_object_or_404(queryset, **filter)  # Lookup the object

class ObjectLogLatest(MultipleFieldLookupMixin, generics.RetrieveAPIView):
    serializer_class = ObjectLogSerializer
    lookup_fields = ('model_one', 'model_two')

    def get_queryset(self):
        model_one = models.Model_one.objects.get(id=self.kwargs['s_pk'])
        model_two = models.Model_two.objects.get(id=self.kwargs['p_pk'])

        if self.request.user.is_superuser:
            try:
                return models.ObjectLog.objects.filter(model_one=model_one).filter(model_two=model_two).latest('created')
            except:
                pass
        else:
            try:
                return models.ObjectLog.objects.filter(user=self.request.user).filter(model_one=model_one).filter(model_two=model_two).latest('created')
            except:
                pass

这是网址:

url(r'^api/sll/(?P<p_pk>\d+)/(?P<s_pk>\d+)/$', scen_views.SolutionLogLatest.as_view()),

我想知道在过滤model_one和model_two的过程中,如何与旧代码做同样的事情来找到特定的ObjectLog。

mixin来自这篇文章:http://www.django-rest-framework.org/api-guide/generic-views/

欢迎任何想法。我是否朝着正确的方向前进?

0 个答案:

没有答案