Не могу создать запись в пользовательском представлении набора на основе параметров URL - PullRequest
0 голосов
/ 26 июня 2019

Здравствуйте, у меня есть набор представления остального django.Для представления create я хочу создать настраиваемое представление, которое создаст новую запись на основе двух разных параметров, которые передаются через URL-адрес - пространство имен и путь.Я посмотрел на документацию, но я не мог найти, как это должно выглядеть.Я не уверен, что мне нужно сделать, чтобы создать запись, основанную на обоих параметрах URL.

Я в основном пытался установить создание для 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)

Я хочу настроить создание для создания предпочтения с двумя параметрами, которые вставляются в URL

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

Я хотел создать новый объект с пространством имен и путем

1 Ответ

0 голосов
/ 26 июня 2019

Это необходимо сделать в 2 этапа:

  1. Добавить аргументы URL-адреса в контекст сериализатора из viewset
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...