Django-Rest-Framework无法解析超链接关系的URL

时间:2019-03-29 06:06:24

标签: django django-rest-framework django-views

我正在尝试为自定义用户模型创建API,以使用通用视图添加新用户。

我遇到一个错误,无法确定其根本原因。 虽然用户添加成功。但是我仍然收到HTTP 500错误。

  

在/ api / new_user上配置不正确   无法使用视图名称“ user-detail”来解析超链接关系的URL。您可能没有在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',)

我的网址格式文件如下

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

请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以使用rest_framework view sets来避免对lookup_fields的需求。

这是一个例子

CreateUserView

...

from rest_framework import viewsets

...

class CreateUserView(viewsets.ModelViewSet):

    serializer_class = UserSerializer

    class Meta:
        model = User

网址模式


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

这将立即为您提供功能。

进一步的自定义:

  1. 模型视图集可为您提供响应,但如果您要像示例中那样自定义响应,则可以像这样在CreateUserView中覆盖create方法:
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