详情查看-----ORM 单表查询
以注册一个用户为例
核心代码
方式一:
# 去数据库中增加数据
from app01 import models
res = models.User.objects.create(username=user_name,password=pwd)
# models.User.objects.create(**{......})
models.User.objects.filter(username=user_name)匹配成功的返回值是一个对象,该对象就是该条记录`
方式二:
res = models.User(username=user_name,password=pwd)
res.save()
该方法是通过类实例化获得一个对象,然后调用内置的save()方法,保存到数据库中
方式一:
先获取记录的对象;
再调用
update()方法只修改括号内的参数,其他参数并不会重新复制一遍
# 先筛选,获取记录对象
user_obj = models.User.objects.filter(username='frank')
user_obj.update(password='3333')
# 也可以直接修改所有的对象
rows=models.User.objects.all().update(password='3333')
print(rows)
'会返回影响的记录条数'
方式二:
先获取记录的对象;
然后用操作对象的方式修改对象的属性,即修改了字段对应的值
最后,再调用
save()方法,但是该方法会将其他没有修改的数据,再保存一次
# 先筛选,获取记录对象
user_obj = models.User.objects.filter(username='frank')
# 修改对象属性
user_obj.password='3333'
# 保存对象
user_obj.save()
每个 QuerySet下也都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象(如果QuerySet对象中只有一个记录对象,那也就只删一条)
# 先筛选,获取记录对象
user_obj = models.User.objects.filter(username='frank')
# 再删除记录对象
user_obj.delete()
# 删除所有
models.User.objects.all().delete()
同样可以调用每一个对象的delete()方法,单独删除某个对象
obj = models.User.objects.filter(username='frank').first()
obj.delete()
当一个表中已经存在记录时,想要增加一个字段需要以下方式
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
password = models.IntegerField()
# 添加的新字段
age = models.IntegerField()
执行数据库迁移命令python3 manage.py makemigrations
选择 1,然后再输入默认值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdKAurFl-1656063983042)(图片.assets/ORM4.png)]
再执行python3 manage.py migrate
models.py中给字段直接添加默认值可以给新加的字段设置成为空,或者直接添加默认值
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
password = models.IntegerField()
age = models.IntegerField()
# 添加的新字段
info = models.CharField(max_length=255, null=True)
hobby = models.CharField(max_length=32, default='tennis')
修改字段只需要直接修改字段对应的代码,然后执行数据库迁移命令即可
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
# password = models.IntegerField()
password = models.CharField(max_length=255, null=True)
age = models.IntegerField()
info = models.CharField(max_length=255, null=True)
hobby = models.CharField(max_length=32, default='tennis')
直接将想要删除的字段对应的代码删除或者注释,然后执行数据库迁移命令即可
class User(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
# password = models.IntegerField()
# password = models.CharField(max_length=255, null=True)
# age = models.IntegerField()
# info = models.CharField(max_length=255, null=True)
# hobby = models.CharField(max_length=32, default='tennis')
对于数量级比较大的数据有专门的方法bulk_create
普通的create方法对于插入大量数据,效率很低。
示例:
from django.shortcuts import render
from app01 import models
def home(request):
book_list = []
for i in range(1,10001):
book_obj = models.Book(title='第 %s 本书'%i)
book_list.append(book_obj)
models.Book.objects.bulk_create(book_list)
return render(...)
方法
bulk_create,需要获得一个可迭代的数据类型,该数据类型中存放等待被创建的数据对象数据对象就是根据
models文件中的类实例化获得的对象最后通过
models.Book.objects.bulk_create(book_list)的方法批量创建,这样创建效率很高