如何升级Django Rest Framework 3.0之前的API,并使RetrieveAPIView与多个PK一起工作

如何升级Django Rest Framework 3.0之前的API,并使RetrieveAPIView与多个PK一起工作,django,rest,django-rest-framework,Django,Rest,Django Rest Framework,我正在升级Django Rest框架3.0之前的API。事实证明,这是一场真正的斗争 这是我的旧代码: class ObjectLogLatest(generics.RetrieveAPIView): serializer_class = ObjectLogSerializer model = models.ObjectLog def get_queryset(self): model_one = self.kwargs['s_pk']

我正在升级Django Rest框架3.0之前的API。事实证明,这是一场真正的斗争

这是我的旧代码:

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()),
url(r'^api/sll/(?P\d+)/(?P\d+)/$,scen\u views.SolutionLogLatest.as\u view()),
我想知道在过滤model_one和model_two时,如何做与旧代码相同的事情来查找特定的ObjectLog

mixin来自本文:

欢迎有任何想法。我的方向对吗