1

Django と Django Rest Framework で API を構築しています

次のエンドポイントがあります:
host/products/はModelViewSetを指しているため、指定されたモデルに対して CRUD が機能しています。

また、次のコードを使用して、configというネストされたモデルの追加アクションを定義します。

@action(detail=False, methods=['get', 'post'])
def config(self, request, *args, **kwargs):

    if request.method == 'GET':
        return super().list(request, *args, **kwargs)

    elif request.method == 'POST':
        return super().create(request, *args, **kwargs)

作成される URL は、 host/products/config/ です。

この URL で、2 番目に指定されたモデルでオブジェクトを作成して一覧表示できます

問題は、ネストされた URL にPATCHおよびDELETEメソッドを含めたいことです。つまり、
host/products/config/ detail /

私はこのようなことをしようとします:

@action(detail=True)
@config.mapping.patch
def update_config(self, request, *args, **kwargs):
    return super().update(request, *args, **kwargs)

しかし、当然のことながら、それはうまくいきません...

詳細アクションを同じビューセット内の別のアクションにマップするにはどうすればよいですか?

完全なコードは次のとおりです。

class ProductViewSet(viewsets.ModelViewSet):

def get_permissions(self):
    ''' Assign permissions based on action. '''
    if self.action in ['suggestions']:
        permission_classes = [AllowAny]
    else:
        permission_classes = [AllowAny] # [IsAdminUser | IsDevUser]
    return [permission() for permission in permission_classes]

def get_queryset(self):
    ''' Return queryset based on action. '''
    if self.action == 'config':
        # Return product details
        return ProductDetails.objects.filter(active=True)
    else:
        # Return active products
        return Product.objects.filter(active=True)

def get_serializer_class(self):
    ''' Return serializer based on action. '''
    if self.action == 'suggestions':
        return SurveySerializer
    elif self.action == 'config':
        return ProductDetailModelSerializer
    else:
        return ProductModelSerializer

@action(detail=False, methods=['get', 'post'])
def config(self, request, *args, **kwargs):

    if request.method == 'GET':
        return super().list(request, *args, **kwargs)

    elif request.method == 'POST':
        return super().create(request, *args, **kwargs)

@action(detail=True)
@config.mapping.patch
def update_config(self, request, *args, **kwargs):
    return super().update(request, *args, **kwargs)
4

0 に答える 0