在项目中遇见个功能,有同样的用户id则刷新用户数据,没有则添加数据
刚开始准备写个检测方法,有的话则返回一个对应的实例对象,没有的话则用save直接创建实例对象
class TestUser(models.Model):
user_id = models.IntegerField(verbose_name='分销员id')
openid = models.CharField(max_length=30, verbose_name='openid')
platform_user_id = models.IntegerField(verbose_name='平台用户id')
nickname = models.CharField(max_length=100, verbose_name='用户名')
phone = models.CharField(max_length=15, verbose_name='手机号')
def check_data(self, item_user_id):
order_exists = TestUser.objects.filter(user_id=item_user_id,)
if order_exists.exists():
print('user 存在' * 10)
print("user 不用插入数据" * 10)
return order_exists[0]
else:
return False
在views.py里面,我们之间调用check_data方法来检测:
user = TestUser()
temp = user.check_data(train_dic['id'])
if temp: # 如果有重复数据了,就更新数据
# 有重复id,把查询出来的实例对象赋值给刚刚创建的实例对象,这样在下面sava时直接就保存了
user = temp
后来想了下,直接重写了save方法,在save方法里面判断即可,不用在前边单独增加方法。
特别注意:model中储存是根据主键来储存的,在数据库里面我们基本默认主键是第一个id,在save时先查看实例对象是否有主键id,如果没有则创建新的主键并把数据存储到新的主键上;如果有则默认更新数据,不会再插入数据。
class TestUser(models.Model):
user_id = models.IntegerField(verbose_name='分销员id')
openid = models.CharField(max_length=30, verbose_name='openid')
platform_user_id = models.IntegerField(verbose_name='平台用户id')
nickname = models.CharField(max_length=100, verbose_name='用户名')
phone = models.CharField(max_length=15, verbose_name='手机号')
class Meta:
verbose_name = '所有用户TEST' # 后台显示名称
verbose_name_plural = verbose_name # 表示复数
def check_data(self, item_user_id):
order_exists = TestUser.objects.filter(user_id=item_user_id,)
if order_exists.exists():
print('user 存在' * 10)
print("user 不用插入数据" * 10)
return order_exists[0]
else:
return False
def save(self):
print(self.user_id)
temp_user_id = self.user_id
order_exists = TestUser.objects.filter(user_id=temp_user_id, )
if order_exists.exists():
print('用户已经存在,现在更新数据,更新的数据id:',order_exists.last().id)
'''此处注意,这里默认更新的是最后一条数据'''
self.id = order_exists.last().id
else:
print('直接增加数据')
pass
super().save()
我们在views.py里面正常调用save()方法即可