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