Python DRF序列化程序更新嵌套用户
我正在使用Django 1.11和Django Rest框架来创建一个API,用户可以在其中创建和更新与Django用户模型相关的员工。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=
我得到的精简代码如下所示: 我有这个模型:
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')