gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:34:28 28 4
gpt4 key购买 nike

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

这两个 View 集:

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 一直告诉我用户名已被使用,但是当我更改用户名和其他信息(如名字和姓氏)然后向服务器发送 PUT 请求时,员工和关联的用户实例正在正确更新。
我错过了什么?
为什么我不能更新员工用户实例,就像我在用户 api 端点时可以更新普通用户实例一样? :/

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

最佳答案

我终于找到了我所缺少的东西。
UserSerializers 将 django.contrib.auth.validators.UnicodeUsernameValidatorUniqueValidator 添加到字段用户名,每次我发出放置请求时都会检查它。
validators = [] 添加到 UserSerializer 的元类解决了我的问题。

关于python - DRF 序列化程序更新嵌套用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874502/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com