Django Rest框架自定义用户模型PUT请求
发送自定义用户模型的Django Rest框架自定义用户模型PUT请求,django,django-rest-framework,put,Django,Django Rest Framework,Put,发送自定义用户模型的PUT请求时遇到问题 将PUT请求发送到/api/provider/1/,其中1是pk,PUT数据phone_number=1234567890时,我收到{“电子邮件”:[“此字段为必填项]} 如果我发送电子邮件和电话号码,我会收到{“电子邮件”:[“此电子邮件的提供商已经存在。”]} 型号 class ProviderManager(BaseUserManager): def _create_user(self, email, password, is_staff
PUT
请求时遇到问题
将PUT请求发送到/api/provider/1/
,其中1
是pk
,PUT数据phone_number=1234567890
时,我收到{“电子邮件”:[“此字段为必填项]}
如果我发送电子邮件
和电话号码
,我会收到{“电子邮件”:[“此电子邮件的提供商已经存在。”]}
型号
class ProviderManager(BaseUserManager):
def _create_user(self, email, password, is_staff, is_superuser, **extra_fields):
'''Creates and saves a User with the given email and password'''
now = timezone.now()
if not email:
raise ValueError('Email can\'t be empty')
email = self.normalize_email(email)
user = self.model(email=email, is_active=True, is_superuser=is_superuser,
is_staff=is_staff, last_login=now, date_joined=now,
**extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password, phone_number, **extra_fields):
extra_fields['phone_number'] = phone_number
return self._create_user(email, password, False, False, **extra_fields)
def create_user(self, email, password, phone_number, **extra_fields):
extra_fields['phone_number'] = phone_number
return self._create_user(email, password, True, True, **extra_fields)
class Provider(AbstractBaseUser):
name = models.CharField(max_length=256, default='')
email = models.EmailField(max_length=256, unique=True, db_index=True)
phone_number = models.CharField(max_length=32, unique=True)
language = models.CharField(max_length=8, default='')
currency = models.CharField(max_length=8, default='')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['phone_number',]
objects = ProviderManager()
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'
def __unicode__(self):
return self.email
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
def email_user(self, subject, message, from_email=None, **kwargs):
send_mail(subject, message, from_email, [self.email])
序列化程序
class ProviderSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('id', 'name', 'email', 'phone_number', 'language', 'currency',)
查看
@api_view(['GET', 'PUT', 'DELETE'])
def provider_detail(request, provider_id):
'''Read, update or delete a provider'''
try:
provider = User.objects.get(pk=provider_id)
except User.DoesNotExist:
return Response(status=HTTP_404_NOT_FOUND)
print('GOT PROVIDER ' + provider.email)
if request.method == 'GET':
serializer = ProviderSerializer(provider)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = ProviderSerializer(provider, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
provider.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
当执行PUT时,您需要提交模型的所有字段,只有补丁允许您通过传递一个字段进行更新当执行PUT时,您需要提交模型的所有字段,只有补丁允许您通过传递一个字段进行更新有一个
部分
参数可以传递给序列化程序,表示它是部分更新
从文档:有一个
partial
参数,您可以将其传递给序列化程序,以指示它是一个部分更新
从文档: