【问题标题】:DRF serializer update nested userDRF 序列化程序更新嵌套用户
【发布时间】:2017-07-02 19:34:44
【问题描述】:

我正在使用 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')

创建和更新用户实例没有问题。
我还可以创建一个员工,作为回报,它会创建一个用户,然后将一个员工分配给该用户。
我什至可以更新员工的用户名,用户也会得到更新,
但我无法更新名字、姓氏、电子邮件、is_staff 和密码。
DRF 一直告诉我用户名已被使用,但是当我更改用户名和其他信息(如 first_name 和 last_name)然后向服务器发送 PUT 请求时,员工和关联的用户实例正在正确更新。
我错过了什么?
为什么我不能像在用户 api 端点更新普通用户实例一样更新员工用户实例? :/

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    终于我发现了我错过了什么。
    UserSerializers 将 django.contrib.auth.validators.UnicodeUsernameValidatorUniqueValidator 添加到字段用户名中,每次我执行 put 请求时都会检查该字段。
    validators = [] 添加到 UserSerializer 的 Meta 类中解决了我的问题。

    【讨论】:

    • 您仍应保留django.contrib.auth.validators.UnicodeUsernameValidator。应该是validators = [django.contrib.auth.validators.UnicodeUsernameValidator]。只留下UniqueValidator
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多