2017-06-06 9 views
0

このコードの部分は、[category_object] .subcats.all()でクエリーセットを塗りつぶします。 SUBCATSは、カテゴリオブジェクトのメソッドであるしましょう:Django REST、選択したオブジェクトのメソッドへのアクセス

シリアライザ:

class CatSrlz(serializers.ModelSerializer): 
class Meta: 
    model = Category 
    fields = ('id', 'label',) 

ビュー:

class CatsViewSet(viewsets.ReadOnlyModelViewSet): 
queryset = Category.objects.filter(parent=None) 
serializer_class = CatSrlz 

def retrieve(self, request, *args, **kwargs): 
    # return Response({'res': self.kwargs}) 
    queryset = Category.objects.get(pk=str(self.kwargs['pk'])).subCats.all() 
    dt = CatSrlz(queryset, many=True) 
    return Response(dt.data) 

とURL:

router.register(r'cats', views.CatsViewSet) 

それは動作しますが、私はそのかなり確信していますそうするより正しい方法がなければならない 1つはありますか?だから、あなたがあなたのオブジェクトを取得する部分を適応させることができ

def get_object(self): 
    """ 
    Returns the object the view is displaying. 

    You may want to override this if you need to provide non-standard 
    queryset lookups. Eg if objects are referenced using multiple 
    keyword arguments in the url conf. 
    """ 
    queryset = self.filter_queryset(self.get_queryset()) 

    # Perform the lookup filtering. 
    lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field 

    assert lookup_url_kwarg in self.kwargs, (
     'Expected view %s to be called with a URL keyword argument ' 
     'named "%s". Fix your URL conf, or set the `.lookup_field` ' 
     'attribute on the view correctly.' % 
     (self.__class__.__name__, lookup_url_kwarg) 
    ) 

    filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} 
    obj = get_object_or_404(queryset, **filter_kwargs) 

    # May raise a permission denied 
    self.check_object_permissions(self.request, obj) 

    return obj 

:単一のオブジェクトを取得する場合
おかげで

答えて

0

、あなたは変更せずにDRFに次のようになり、あなたのビューでGET_OBJECT方法を、使用することができます:

filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} 
obj = get_object_or_404(queryset, **filter_kwargs) 

サブキャットロジックを追加してください。

あなたは

dt = CatSrlz(queryset, many=True) 

を使用している理由ちなみに、私は得ることはありませんが、単一のオブジェクトを返す「取得」ではないでしょうか?

+0

ありがとうございます。確かめます。はい、私はそう思う、それは間違ったアプローチのためだった!それを訂正した。あなたの言及に感謝 – Arshamnm

関連する問題