2017-07-02 12 views
1

私はDjango 1.11とDjango Rest Frameworkを使用してAPIを作成しています。ここで、ユーザはdjangoユーザモデルに関連する従業員を作成して更新できます。DRFシリアライザのネストされたユーザの更新

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee') 
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 

これら二つのビューセット:

class UserViewSet(viewsets.ModelViewSet): 
    serializer_class = serializers.UserSerializer 
    permission_classes = [permissions.IsAuthenticated] 

class EmployeeViewSet(viewsets.ModelViewSet): 
    serializer_class = serializers.EmployeeSerializer 
    permission_classes = [permissions.IsAuthenticated] 
私はこのモデルを持っている

:私が持っている
ストリップダウンのコードは次のようになります

とこれらの2つのシリアライザ:

class UserSerializer(serializers.HyperlinkedModelSerializer) 
    class Meta 
     models = User 
     fields = ('url', 'id', 'username', 'email', 'is_staff', 'first_name', 'last_name', 'password') 
     read_only_field = ('id',) 

    def validate(self, data) 
     # ... Check if data is valid and if so... 
     return data 

class EmplyoeeSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    class Meta: 
     model = Employee 
     field = ('url', 'uuid', 'user') 
     read_only_field = ('uuid') 

    def validate(self, data): 
     return data 

    def create(self, validated_data): 
     user = User(**validated_data['user']) 
     user.save() 
     employee = Employee(user=user) 
     employee.save() 
     return employee 

    def update(self, employee, user): 
     employee.user.username = user.username 
     employee.user.email = user.email 
     employee.user.first_name = user.first_name 
     employee.user.last_name = user.last_name 
     employee.user.is_staff = user.is_staff 
     # ... Check if password has changed, and if so... 
     employee.user.set_password(user.password) 
     employee.user.save() 
     employee.save() 
     return employee 

また、私は

router = routers.DefaultRouter() 
router.register(r'api/user', views.UserViewSet, base_name='user') 
router.register(r'api/employee', views.UserViewSet, base_name='employee') 

ユーザーのインスタンスの作成と更新は問題ありません私のurls.pyにこれら二つのルータを持っています。
また、代わりにユーザーを作成し、そのユーザーに従業員を割り当てる従業員を作成することもできます。
私は従業員のユーザー名を更新することもできます。ユーザーは
も更新されますが、first_name、last_name、email、is_staff、およびpasswordは更新できません。
DRFはユーザー名がすでに使用されていることを伝え続けますが、ユーザー名やfirst_nameやlast_nameなどの情報を変更してサーバーにPUT要求を送信すると、従業員と関連付けられたユーザーインスタンスが正しく更新されます。
何が欠けていますか?
なぜ私はユーザーのapiエンドポイントにいるときに通常のユーザーインスタンスを更新できるように、従業員のユーザーインスタンスを更新できませんか? :/

ありがとうございます、
助けていただければ幸いです。

答えて

0

最後に、私は何が欠けているかを知りました。
UserSerializersは、ユーザー名フィールドにdjango.contrib.auth.validators.UnicodeUsernameValidatorUniqueValidatorを追加します。これは、put要求を行うたびにチェックされます。
UserSerializerのMetaクラスにvalidators = []を追加すると、私の問題が解決しました。

+0

あなたは 'django.contrib.auth.validators.UnicodeUsernameValidator'を保つ必要があります。 'validators = [django.contrib.auth.validators.UnicodeUsernameValidator]'でなければなりません。 'UniqueValidator'だけを残してください。 – cezar

関連する問題