【问题标题】:Cant create a record within viewset custom view based on url parameters无法根据 url 参数在视图集自定义视图中创建记录
【发布时间】:2019-06-26 19:04:49
【问题描述】:

您好,我有一个 django rest 框架视图集。对于创建视图,我想创建一个自定义视图,该视图将基于两个不同的参数创建一个新记录,这些参数是通过命名空间和路径的 url 传递的。我查看了文档,但找不到它的外观。我不确定我需要做什么才能根据两个 url 参数创建记录。

我基本上尝试将 create 设置为 CreateAPIView 但它不起作用

class PreferenceViewSet(viewsets.ViewSet):
    queryset = Preference.objects.all()
    serializer_class = PreferenceSerializer

    def get_permissions(self):
        if self.action == 'create' or self.action == 'destroy':
            permission_classes = [IsAuthenticated]
        else: 
            permission_classes = [IsAdminUser]
        return [permission() for permission in permission_classes]

    def list(self, request):
        queryset = Preference.objects.all()
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)

    def create(self, request):
        queryset = Preference.objects.all()
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)

我想设置 create 以使用在 url 中传递的两个参数创建首选项

path('preferences/<str:namespace>/<str:path>', preference_path, name='preference-path'),

我希望它用命名空间和路径创建一个新对象

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您需要分两步完成:

    1. 将 url 参数从视图集中添加到序列化程序上下文中
    2. 重写序列化程序上的create 方法并使用上下文中传递的数据来创建记录

    所以,首先重写get_serializer_context 方法以将参数添加到上下文中:

    class PreferenceViewSet(viewsets.ViewSet):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self._namespace = None
            self._path = None
        ...
        ...
    
        def get_serializer_context(self):
            context = super().get_serializer_context()
            context.update(namespace=self._namespace, path=self._path)
            return context
    
        def create(self, request):
            self._namespace = self.kwargs['namespace']
            self._path = self.kwargs['path']
    
            queryset = Preference.objects.all()
            serializer = PreferenceSerializer(queryset, many=True)
            return Response(serializer.data)
    

    现在,您可以访问序列化程序的覆盖 create 方法中的参数并根据需要创建记录,例如:

    class PreferenceSerializer(serializers.HyperlinkedModelSerializer):
        ...
        ...
        def create(self, validated_data):
            namespace = self.context['namespace']
            path = self.context['path']
            # Create object here based on the params
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多