orm---get_or_create()

本文介绍了Django中get_or_create方法的使用,该方法用于查询或创建数据库记录。在用户注册登录场景下,如果手机号和验证码匹配,通过get_or_create检查用户是否存在,若不存在则创建新用户,并使用JWT生成登录令牌。同时,文章涵盖了序列化过程中的数据验证和密码处理。
摘要由CSDN通过智能技术生成

 1. 使用

# 使用方式
user, buer = User.objects.get_or_create(name="dbj", defaults={'address':'xxx'})

2.用法和参数介绍

2.1用法介绍---------返回两个值user buer

get_or_create,查询或者创建一条数据,首先是执行的时候,首先会去表中查询有没有这个值,如果有就返回,没有就创建。
 
get_or_create会返回一个tuple,第一个值是查到或者创建的数据对象---user,buer第二个值是一个布尔,表示是否执行了创建操作。创建为True,未创建为False
 
在进行查询的时候和使用get查询类似,当查到超过一条数据的时候会触发MultipleObjectsReturned。
创建的时候也和使用create创建类似。
 
如果你正在使用MySQL,请确保使用READ COMMITTED 隔离级别而不是默认的REPEATABLE READ,否则你将会遇到get_or_create 引发IntegrityError 但对象在接下来的get() 调用中并不存在的情况。
 


 2.2参数介绍


**kwargs,数据的查询条件。
defaults,如果没有查到数据,创建数据时提供的填充数据。

 实例

下面代码实现了用户输入手机号,验证码,数据库中没有就给它在注册,然后签发token登录

有就直接登录

--------------视图类

 @action(methods=["POST"], detail=False)  # {"mobile":15670883607,code:7777}
    def one_login(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            token = serializer.context.get('token')  # 从序列化类出来,数据校验结束
            username = serializer.context.get('username')
            return APIResponse(code=100, token=token, username=username)
        else:

            raise APIException(serializer.errors)

 ----------------序列化类

class OneRegisterSerializer(serializers.ModelSerializer):
    code = serializers.CharField(max_length=4, min_length=4, write_only=True)
    mobile=serializers.CharField(required=False)

    class Meta:  # {"mobile":15670883607,code:7777}
        model = models.User
        fields = ['mobile', 'code']

    def _check_username(self, attrs):
        fake = Faker()
        username = fake.name().split(' ')[0].lower()
        return username

    def _check_password(self, attrs):
        mobile = attrs.get('mobile')
        #cache.get('send_sms_password_%s' % mobile)
        password = "123456"
        new_password = make_password(password)
        # new_password加密后的
        return new_password



    def _get_token(self, user):
        new_payload = jwt_payload_handler(user)
        token = jwt_encode_handler(new_payload)
        return token
    def _check_code(self, attrs):
        mobile = attrs.get('mobile')
        code = attrs.get('code')
        old_code = cache.get('send_sms_code_%s' % mobile)
        if not (code == old_code or (settings.DEBUG or code == "8888")):
            raise APIException('验证码错误')
    def validate(self, attrs):
        mobile = attrs.get('mobile')

        username = self._check_username(attrs)    #生成随机名字
        password = self._check_password(attrs)    #拿到加密的密码
        self._check_code(attrs)                    #查看验证码

        user, buer = models.User.objects.get_or_create(mobile=mobile, defaults={'mobile': mobile,
                                                                                "username": username,
                                                                                'password': password})
        token = self._get_token(user)
        self.context['username']=user.username
        self.context['token']=token
        return attrs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值