Django-Rest-Framework Не удалось разрешить URL для связи с гиперссылкой - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь создать API для пользовательской модели пользователя, чтобы добавить нового пользователя, используя общие представления.

Я получаю сообщение об ошибке и не могу определить его причину.Хотя пользователь успешно добавлен.Но я все еще получаю ошибку HTTP 500 в своем ответе.

ImproperlyConfigured at / api / new_user Не удалось разрешить URL для связи с гиперссылкой, используя имя представления «user-detail».Возможно, вам не удалось включить связанную модель в API или неправильно настроить атрибут lookup_field в этом поле.

Мой класс apiView выглядит следующим образом.

class CreateUserView(CreateAPIView):
"""
This view creates a new user
"""
serializer_class = UserSerializer

def perform_create(self, serializer: UserSerializer):
    try:
        serializer.save(
            email=serializer._validated_data['email'],
            first_name=serializer._validated_data['first_name'],
            last_name=serializer._validated_data['last_name'],
            password=make_password(serializer._validated_data['password'])
        )
    except Exception as exception:
        return JsonResponse({
            'success': False,
            'error': 'Error occured in registering user!'
        },
            status=500)

    return JsonResponse({'success': True})

и мой сериализатор класса, как показано ниже.

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(max_length=128, min_length=8,
                                     style={'input_type': 'password'}, write_only=True)

    class Meta:
        model = User
        fields = ('url', 'id', 'email', 'first_name', 'last_name', 'password',)

и мой файл шаблонов URL выглядит следующим образом

urlpatterns = [
    path('api/new_user', CreateUserView.as_view()),
    path('api/login/', obtain_auth_token, name='api-token-auth')
]

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 29 марта 2019

Вы можете обойти необходимость в lookup_fields, используя rest_framework view sets .

Вот пример

CreateUserView

...

from rest_framework import viewsets

...

class CreateUserView(viewsets.ModelViewSet):

    serializer_class = UserSerializer

    class Meta:
        model = User

Шаблоны URL


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/new_user', CreateUserView.as_view({'post': 'create'}))
]

Этопредоставит вам функциональность прямо из коробки.

Дальнейшая настройка:

  1. Набор параметров модели предоставляет ответы для вас, но если вы хотите настроить свой ответ какв вашем примере вы можете переопределить метод create в CreateUserView следующим образом:
class CreateUserView(viewsets.ModelViewSet):

    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        return JsonResponse({'success': True})

    class Meta:
        model = User

...