检查用户创建新的用户djangorestframework
问题描述:
之前存在到目前为止,我有 - >检查用户创建新的用户djangorestframework
串行:
class UserSerializer(serializers.ModelSerializer):
"""Serializer to map the model instance into json format."""
class Meta:
"""Map this serializer to a model and their fields."""
model = User
fields = ('id','username', 'mobile', 'password',
'first_name','last_name','middle_name',
'profile_pic','short_bio','friends_privacy',
'address_1','address_2','city',
'state','country','pin','verification_code',
'is_active','is_blocked','is_reported',
'date_created','date_modified')
extra_kwargs = {'password': {'write_only': True}}
read_only_fields = (
'date_created', 'date_modified',
'is_staff', 'is_superuser', 'is_active',
'date_joined',)
def create(self, validated_data):
mobile_ = validated_data['mobile']
password_ = validated_data['password']
username_ = validated_data['username']
motp = self.context['request'].GET['motp']
eotp = self.context['request'].GET['eotp']
email_ = self.context['request'].GET['email']
mflag = api.views.checkOTP_(mobile_,motp)
eflag = api.views.checkOTP_(email_,eotp)
if (mflag and eflag):
user = User(
username=username_,
email =email_,
password = make_password(password_),
mobile = mobile_,
)
user.set_password(validated_data['password'])
user.save()
return user
观点:
class UserView2(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
model = User
def get_permissions(self):
# allow non-authenticated user to create via POST
return (AllowAny() if self.request.method == 'POST'
else IsStaffOrTargetUser()),
我需要检查的手机和电子邮件OTP并且如果具有相同移动设备或电子邮件的用户已经存在。 如果用户已存在,则返回错误的json响应:already exists!
。 如果用户是新的并且OTP错误再次发生错误。 如果用户是新的并且OTP正确,请创建一个帐户。
这里的问题是我试图添加函数来检查def create
of UserSerializer
里面的otp验证。但是一个序列化器应该返回模型实例。但是,如果您看到代码,则只有在OTP正确且用户实例返回的情况下,才能创建用户。并没有else
。
那么是否有更好的方法来检查视图本身的OTP?
答
这不是实现它的正确方法。串行器仅用于验证目的。您不应该在串行器中实现create
方法,而应将其写入ViewSet
。创建对象是一种业务逻辑。它应该总是在ViewSet
。向串行器写一个验证方法。我在写下面
serializers.py
class UserSerializer(serializers.ModelSerializer):
def validate_mobile(self, mobile_num):
is_already_exists = Model.objects.filter(mobile=mobile_num).exists()
if is_already_exists:
raise serializers.ValidationError('already exists')
return mobile_num
class Meta:
model = User
fields = (
'id','username', 'mobile', 'password',
'first_name','last_name','middle_name','profile_pic',
'short_bio','friends_privacy','address_1',
'address_2','city','state','country',
'pin','verification_code','is_active',
'is_blocked','is_reported',
'date_created','date_modified'
)
extra_kwargs = {'password': {'write_only': True}}
read_only_fields = (
'date_created', 'date_modified','is_staff',
'is_superuser', 'is_active', 'date_joined',
)
Viewsets.py(业务逻辑)
class UserView2(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
def get_permissions(self):
# allow non-authenticated user to create via POST
return (AllowAny() if self.request.method == 'POST'
else IsStaffOrTargetUser()),
def create(self, serializer):
# your logic goes here.
答
一个示例代码我不@Anjaneyulu有.. 串行手柄同意创建对象以及..因此,你有serializer.save()
的原因。
但对于提高现有的具有相同的OTP邮件/电话用户异常的目的,你应该写自己的def validate_mobile(self, data)
和def validate_email(self, data)
。 DRF序列化程序将首先在类中查找这些方法,并在它们存在时运行它们。因此,您的用于检查这些字段的定制逻辑可能是:
class UserSerializer(serializers.ModelSerializer):
def validate_mobile(self, value):
ModelClass = self.Meta.model
if ModelClass.objects.filter(mobile=value).exists():
raise serializers.ValidationError('already exists')
return value
def validate_email_(self, value):
ModelClass = self.Meta.model
if ModelClass.objects.filter(email_=value).exists():
raise serializers.ValidationError('already exists')
return value
class Meta:
model = User
fields = (
...,
)
如果字段没有更新,这是否会干扰更新的情况? –