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

时间:2017-07-02 19:34:45

标签: python django django-rest-framework

我使用Django 1.11和Django Rest Framework来创建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 EmployeeViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.EmployeeSerializer
    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

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

我的urls.py

中也有这两个路由器
router = routers.DefaultRouter()
router.register(r'api/user', views.UserViewSet, base_name='user')
router.register(r'api/employee', views.UserViewSet, base_name='employee')

创建和更新用户实例没有问题 我还可以创建一个员工,作为回报,他将创建一个用户,然后由该员工为该用户提供帮助 我甚至可以更新员工的用户名,用户也会得到更新,
但我无法更新first_name,last_name,email,is_staff和密码 DRF一直告诉我已经使用了用户名,但是当我更改用户名和其他信息(如first_name和last_name)然后向服务器发送PUT请求时,员工和相关用户实例正在正确更新。
我错过了什么?
为什么我不能更新员工用户实例,就像我可以在用户api端点更新普通用户实例一样? :/

提前致谢,
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

最后我发现了我所缺少的东西 UserSerializers将django.contrib.auth.validators.UnicodeUsernameValidatorUniqueValidator添加到字段用户名中,每次执行放置请求时都会对其进行检查。
validators = []添加到UserSerializer的Meta类解决了我的问题。