2016-04-27 8 views
0

私は次のように記録(ページあたり10)ページ区切りの形式のビューを持っている:Django RESTのレコードの現在のページを処理するには?

class Foo(models.Model): 
    bar = models.BooleanField(db_index=True) 
    user = models.ForeignKey(User, db_index=True, editable=False) 
    baz = models.CharField(max_length=120) 
    created = models.DateTimeField(db_index=True, auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

class UserSerializer(ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username') 

class FooSerializer(ModelSerializer): 
    user = UserSerializer() 
    class Meta: 
     model = Foo 

class FooPagination(PageNumberPagination): 
    page_size = 10 

class FooView(ListAPIView): 
    serializer_class = FooSerializer 
    pagination_class = FooPagination 
    def get_queryset(self): 
     user = self.request.user 
     '''   
     Do something here (or when page is requested) with each record on 
     the current page. 
     ''' 
     return Foo.objects.filter(bar=true, user=user).order_by('created') 

は、どのように私は、現在のページにあるフー・レコードを処理することができますか?

答えて

1

はたぶん、より良い解決策があるが、私は、クエリセットを濾過し、ページ分割された後に事後処理を行うために自分自身のViewクラスを展開しなければならなかったが、それはシリアル化される前に:

class DecoratedListModelMixin(object): 
    """ 
    Apply a decorator to the list view before serializing 
    """ 
    def list(self, request, *args, **kwargs): 
     has_decorator = (hasattr(self, 'decorator') and self.decorator is not None) 

     queryset = self.filter_queryset(self.get_queryset()) 
     page = self.paginate_queryset(queryset) 

     if page is not None: 

      if has_decorator: 
       serializer = self.get_serializer(self.decorator(page, request), many=True) 
      else: 
       serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     if has_decorator: 
      serializer = self.get_serializer(self.decorator(queryset, request), many=True) 
     else: 
      serializer = self.get_serializer(queryset, many=True) 
     return Response(serializer.data) 

class DecoratedListAPIView(DecoratedListModelMixin, generics.GenericAPIView): 
    def get(self, request, *args, **kwargs): 
     return self.list(request, *args, **kwargs) 

使用法:

class FooView(DecoratedListAPIView): 
    serializer_class = FooSerializer 
    pagination_class = FooPagination 
    decorator = foo_decorator 
    def get_queryset(self): 
     user = self.request.user 
     return Foo.objects.filter(bar=true, user=user).order_by('created') 

# queryset contains current page only 
def foo_decorator(view, queryset, request): 
    for foo in queryset: 
     #... 
    return queryset 
+0

GenericAPIViewの代わりに "def foo_decorator(obj、queryset、request)"とListAPIViewを使用しました。 – tyebillion

+0

デコレータが動作していますが、JSON結果フィールドにデータが戻ってきません。 – tyebillion

+0

...カウントがゼロではないにもかかわらず。 – tyebillion

関連する問題