我使用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端点更新普通用户实例一样? :/
提前致谢,
任何帮助将不胜感激。
答案 0 :(得分:0)
最后我发现了我所缺少的东西
UserSerializers将django.contrib.auth.validators.UnicodeUsernameValidator
和UniqueValidator
添加到字段用户名中,每次执行放置请求时都会对其进行检查。
将validators = []
添加到UserSerializer的Meta类解决了我的问题。