gpt4 book ai didi

django - 在创建新用户之前检查用户是否存在 djangorestframework

转载 作者:行者123 更新时间:2023-12-04 16:06:57 25 4
gpt4 key购买 nike

到目前为止我有 ->

序列化器:

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 中添加检查 otp 验证的功能 of UserSerializer .但是序列化程序应该返回模型实例。但是,如果您看到代码,则只有当 OTP 正确且返回用户实例时,我才能创建用户。而且没有 else .

那么有没有更好的方法来检查 View 本身中的 OTP?

最佳答案

我不同意@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 = (
...,
)

关于django - 在创建新用户之前检查用户是否存在 djangorestframework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47105250/

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