2017-09-13 5 views
2

django restフレームワークを使用してユーザー登録用のapiを作成しようとしています。
私は、次のmodels.pyファイルユーザー登録Django Rest Frameworkを使用する

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 


class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE , primary_key = True) 
    mobileNumber = models.IntegerField(default=0) 
    avatar= models.ImageField(upload_to = 'User/' , default = '/static/User/defaultProfileImage.png') 


def create_user_profile(sender, **kwargs): 
    if kwargs['created']: 
     profile = UserProfile.objects.create(user=kwargs['instance']) 


post_save.connect(create_user_profile, sender=User) 

これは私のSerializers.pyファイル

from rest_framework import serializers 
from User.models import UserProfile 
from django.contrib.auth.models import User 





class UserSerializer(serializers.HyperlinkedModelSerializer): 
    username = serializers.CharField() 
    password1 = serializers.CharField(
     style={'input_type': 'password'}, 
     write_only=True) 
    password2 = serializers.CharField(
     style={'input_type': 'password'}, 
     write_only=True) 
    email = serializers.EmailField() 
    class Meta: 
     model = User 
     fields = (
      'id', 
      'username', 
      'password1', 
      'password2', 
      'email', 
      'first_name', 
      'last_name', 
      ) 

class UserProfileSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    class Meta: 
     model = UserProfile 
     fields = (
      'user', 
      'mobileNumber', 
      'avatar') 

そして以下であるが、私のviews.pyファイル

from User.models import UserProfile 
from .serializers import UserProfileSerializer 
from rest_framework.viewsets import ModelViewSet 


class UserProfileViewSet(ModelViewSet): 
    queryset = UserProfile.objects.all() 
    serializer_class = UserProfileSerializer 

である必要がありAPIビューを使用してユーザー登録を作成する最適な方法は何ですか?私は帽子を作りました。私は、UserProfileシリアライザクラスのcreateメソッドをオーバーライドしたり、drf-writable-nestedでもエラーが発生したりするなど、多くの選択肢を試しました。
私は退出を提案してください。また、私は、apiがアンドロイドアプリによって呼び出されたときにユーザーを登録できることを願っています。

+0

あなた自身の登録を展開する代わりに、Django-RestAuthやdjango-knoxなどの登録用の利用可能なパッケージを利用してみませんか?ここを見て。 http://www.django-rest-framework.org/api-guide/authentication/ –

答えて

0

Serializers.pyファイルでこれを行うことができます。これは動作するはずです。

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    mobileNumber = serializers.IntegerField() 
    avatar= serializers.ImageField() 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 'email', 'password', 'mobileNumber', 'avatar') 

    def create(self, validated_data): 
     mobile_number = validated_data.pop('mobileNumber', None) 
     user = super(UserSerializer, self).create(validated_data) 
     user.set_password(raw_password=validated_data['password']) 
     user.save() 
     userprofile = user.userprofile 
     userprofile.mobileNumber = mobile_number 
     userprofile.save() 
     return user 

    def update(self, instance, validated_data): 
     mobile_number = validated_data.pop('mobileNumber', None) 
     userprofile = instance.userprofile 
     userprofile.mobileNumber = mobile_number 
     userprofile.save() 
     return super(UserSerializer, self).update(instance, validated_data) 

チャックUserProfileSerializerこのユースケースのために、私はその本当に必要としないここに感じます。 views.pymodels.pyは私に似ています。 これはあなたに役立ちます:-)

関連する問題