Python DRF序列化程序更新嵌套用户

Python DRF序列化程序更新嵌套用户,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django 1.11和Django Rest框架来创建一个API,用户可以在其中创建和更新与Django用户模型相关的员工。 我得到的精简代码如下所示: 我有这个模型: class Employee(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee') uuid = models.UUIDField(primary_key=

我正在使用Django 1.11和Django Rest框架来创建一个API,用户可以在其中创建和更新与Django用户模型相关的员工。
我得到的精简代码如下所示:

我有这个模型:

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 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

我的URL.py中也有这两个路由器

router = routers.DefaultRouter()
router.register(r'api/user', views.UserViewSet, base_name='user')
router.register(r'api/employee', views.UserViewSet, base_name='employee')
创建和更新用户实例没有问题。
我还可以创建一个员工,作为回报,该员工将创建一个用户,然后创建一个员工助理给该用户。
我甚至可以更新员工的用户名,用户也会得到更新,
但我无法更新名字、姓氏、电子邮件、is员工和密码。
DRF一直告诉我用户名已被使用,但当我更改用户名和其他信息(如名字和姓氏),然后向服务器发送PUT请求时,员工和关联的用户实例将得到正确更新。
我错过了什么?
为什么我不能像在用户api端点时更新普通用户实例那样更新employees用户实例/

提前感谢,

任何帮助都将不胜感激。

最后我发现了我缺少的东西。
UserSerializer将
django.contrib.auth.validators.UnicodeUsernameValidator
UniqueValidator
添加到字段用户名中,该字段在我每次执行put请求时都会被检查。

validators=[]
添加到UserSerializer的元类解决了我的问题。

您仍然应该保留
django.contrib.auth.validators.UnicodeSerNameValidator
。它应该是
validators=[django.contrib.auth.validators.UnicodeurNameValidator]
。仅省略
唯一验证程序
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')