我正在从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/
欢迎任何想法。我是否朝着正确的方向前进?