JRazor
@JRazor
Senior StarkOverFlow Programmer

CreateModelMixin: Method Not Allowed. В чем причина?

Господа, не понимаю, что делаю не так. Есть вьюха:

class SurveySessionViewSet(mixins.CreateModelMixin,
                           mixins.RetrieveModelMixin,
                           viewsets.GenericViewSet):

    queryset = SurveySession.objects.all()
    serializer_class = SurveySessionSerializer
    permission_classes = (IsAuthenticated,)

Ее сериалайзер:
class SurveySessionSerializer(serializers.ModelSerializer):
    survey = serializers.PrimaryKeyRelatedField(queryset=Survey.objects.all())
    user = serializers.HiddenField(default=serializers.CurrentUserDefault())

    answers = AnswerShortSerializer(many=True, read_only=True)
    is_completed = serializers.BooleanField(read_only=True)

    class Meta:
        model = SurveySession
        fields = '__all__'
        read_only_fields = ('created_at', 'completed_at')

    def create(self, validated_data):
        # If session exists - return
        opened_sessions = SurveySession.objects.filter(
            **validated_data,
            completed_at__isnull=True,
        )

        if opened_sessions.exists():
            return opened_sessions.first()

        # Else - create
        instance = super().create(validated_data)

        return instance

Вызываю вьюху ее с теста:
def test_attributes(self):
        self.assertIn('GET', self.view_set.allowed_methods)
        self.assertIn('POST', self.view_set.allowed_methods)

И post не определяется.
Окей, вызываю create:
# self.url_list - это basename-list, соответственно, его выдает правильно
response = client.post(self.url_list, data=data)

И получаю Method Not allowed!

Client выдает следующую информацию о методах: 'allow': ('Allow', 'GET, HEAD, OPTIONS')

В чем может быть проблема?
  • Вопрос задан
  • 811 просмотров
Пригласить эксперта
Ответы на вопрос 1
Guest007
@Guest007
Django, Python, Linux и всё такое...
О POST и GET - не знает. Читай документацию внимательно. Если ты наследуешь и используешь GenericViewSet, то у него есть методы create, retrieve, update и т.д. Т.е. он (ViewSetMixin) оперирует понятиями действия (action), а не конкретными методами.

В urls.py пропиши в вызове магию (как описано в комменте к ViewSetMixin):
url(r'^ser/vey/$', SurveySessionViewSet.as_view(
                      {
                          'get': 'retrieve',
                          'post': 'create',
                          'patch': 'update',
                      }
                  ), name='sur-vay'),

или используй роутеры: https://www.django-rest-framework.org/api-guide/ro...
Это будет правильнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы