私は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エンドポイントにいるときに通常のユーザーインスタンスを更新できるように、従業員のユーザーインスタンスを更新できませんか? :/
ありがとうございます、
助けていただければ幸いです。
あなたは 'django.contrib.auth.validators.UnicodeUsernameValidator'を保つ必要があります。 'validators = [django.contrib.auth.validators.UnicodeUsernameValidator]'でなければなりません。 'UniqueValidator'だけを残してください。 – cezar