在 shell 环境下的项目根目录下执行 ,生成数据移植文件
python3 manage.py makemigrations
在 shell 环境下的项目根目录下执行 ,真正改变数据库
python3 manage.py migrate
使用 python3 manage.py shell 进入可以操作数据库的虚拟环境
#在models里创建数据库
class UsersProfile(AbstractUser):
gender_choice = (
('1', "男"),
('2', "女")
)
mobile = models.CharField('手机', max_length=11)
gender = models.CharField("性别", choices=gender_choice, default="1", max_length=1)
avatar = models.ImageField(verbose_name="头像", upload_to='users/%Y/%m/%d/',
max_length=128, null = True, blank = True)
#添加数据
from users.UsersProfile import users
#方法一
obj = UsersProfile(
username="山炮",
password='1',
email="3@3.com",
mobile='13733333333'
)
obj.save()
#方法二
user_info_dic = {"username":"王二锤",
"password":'1',
"email":"2@qf.com",
"mobile":'13722222222'}
models.UsersProfile.objects.create(**user_info_dic)
#方法三
objs = [
models.UsersProfile(**{"username":"王二锤1", "password": '1', "email": "2@qf.com", "mobile": '13722222222'}),
models.UsersProfile(**{"username":"王二锤2", "password": '1', "email": "22@qf.com", "mobile": '13722222223'}),
models.UsersProfile(**{"username":"王二锤3", "password": '1', "email": "3@qf.com", "mobile": '13722222222'}),
]
models.UsersProfile.objects.bulk_create(objs)
#数据查询
UsersProfile.objects.all()
<QuerySet [<UsersProfile: 山炮>, <UsersProfile: 王二锤1>, <UsersProfile: 王二锤2>, <UsersProfile: 王二锤3>, <UsersProfile: admin>, <UsersProfile: 大山>]>
UsersProfile.objects.last().username
'王二锤3'
UsersProfile.objects.filter(username= "山炮")
<QuerySet [<UsersProfile: 山炮>]>
UsersProfile.objects.filter(username= "大山").values()
<QuerySet [{'id': 6, 'password': '1', 'last_login': None, 'is_superuser': False, 'username': '大山', 'first_name': '', 'last_name': '', 'email': '3@3.com', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 9, 22, 13, 34, 25, 459109), 'mobile': '13733333333', 'gender': '1', 'avatar': ''}]>
UsersProfile.objects.filter(username= "大山").values_list()
<QuerySet [(6, '1', None, False, '大山', '', '', '3@3.com', False, True, datetime.datetime(2019, 9, 22, 13, 34, 25, 459109), '13733333333', '1', '')]>
UsersProfile.objects.filter(username="大山").values_list("id",flat=True)
<QuerySet [6]>
#删除数据
UsersProfile.objects.filter(id="1").delete()
#更新数据
obj = models.UsersProfile.objects.get(id=1) (当然也可以使用字典的取值方法[])
obj.email = "1@qf.com"
obj.save()
高级查询
count
UsersProfile.objects.filter(username="大山").count()
1
gt,lt,gte,lte
UsersProfile.objects.filter(id__gt=2)
<QuerySet [<UsersProfile: 王二锤2>, <UsersProfile: 王二锤3>, <UsersProfile: admin>, <UsersProfile: 大山>]>
相同的lt,gte,lte
UsersProfile.objects.filter(id__gt=1,id__lt=3)
<QuerySet [<UsersProfile: 王二锤1>]>
in
UsersProfile.objects.filter(id__in=[2,3])
<QuerySet [<UsersProfile: 王二锤1>, <UsersProfile: 王二锤2>]>
当然,not in的作用与in相反
判断某个字段是否为空
UsersProfile.objects.filter(email__isnull=True)
between and
UsersProfile.objects.filter(id__range=[1,2])
<QuerySet [<UsersProfile: 山炮>, <UsersProfile: 王二锤1>]>
# 其他类似
startswith,istartswith, endswith, iendswith,
like
# 不区分大小写
models.UsersProfile.objects.filter(username__icontains="山")
order by
# asc
models.UsersProfile.objects.filter(username='山炮').order_by('id')
# desc
models.UsersProfile.objects.filter(username='山炮' ).order_by('-id')
group by
UsersProfile.objects.filter(mobile="13722222222").values('id').annotate(c=Count('id'))
<QuerySet [{'id': 2, 'c': 1}, {'id': 4, 'c': 1}]>
查看原始的sql语句
str(models.UsersProfile.objects.filter(id=1).values('id').annotate(c=Count('id')).query)
'SELECT `db_usersprofile`.`id`, COUNT(`db_usersprofile`.`id`) AS `c` FROM `db_usersprofile` WHERE `db_usersprofile`.`id` = 1 GROUP BY `db_usersprofile`.`id` ORDER BY NULL'
limit
UsersProfile.objects.all()[2:3]
<QuerySet [<UsersProfile: 王二锤2>]>
python中的切片类似,只能取到开头,取不到结尾
执行原始sql语句
u = UsersProfile.objects.raw("select * from users_usersprofile")
u得到<RawQuerySet: select * from users_usersprofile> 为可迭代对象
u[0]
<UsersProfile: 山炮>
u[0].id
1 #当然每次都会触发查询
for i in u:
print(i.mobile)
13733333333
13722222222
13722222223
13722222222
获取表基本信息
u.model #表模型
users.models.UsersProfile
u.columns #表字段
['id',
'password',
'last_login',
'is_superuser',
'username',
'first_name',
'last_name',
'email',
'is_staff',
'is_active',
'date_joined',
'nick_name',
'birday',
'gender',
'address',
'mobile',
'image']
ORM高级
表关系
# 一对一:
models.OneToOneField(OtherModel)
# 多对一:
models.ForeignKey(OtherModel, on_delete=models.CASCADE)
# 多对多:
models.ManyToManyField(OtherModel)
# 正向查,就是查我属于谁
# 使用 Frenkey 的字段名,进行连表查询
qst = models.Cabinet.objects.first()
qst.name
Out[43]: 'Y-S-01'
qst.idc.name
Out[44]: '亦庄'
# 反向查,就是查谁属于我
# 使用小写的表名加 _set,进行连表查询
qst = models.IDC.objects.last()
qst.cabinet_set.all()
###############################################
# 正向,就是从含有 ForeignKey 字段的表开始查
# 先获取到一个 QueySet 对象
qst = models.Cabinet.objects.filter(id=1)
# 再用 QuerySet 对象查询字段的值
# 结果是字典
qst.values("name","idc__name")
Out[53]: <QuerySet [{'name': 'Y-S-01', 'idc__name': '亦庄'}]>
# 结果是元组
qst.values_list("name","idc__name")
Out[54]: <QuerySet [('Y-S-01', '亦庄')]>
###############################################
# 反向查,表的映射类名称的小写
qst = models.IDC.objects.filter(id=1)
# 结果是字典
qst.values("name", "cabinet__name")
Out[58]: <QuerySet [{'name': '亦庄', 'cabinet__name': 'Y-S-01'}, {'name': '亦庄', 'cabinet__name': 'Y-S-002'}]>
# 结果是元组
qst.values_list("name", "cabinet__name")
Out[60]: <QuerySet [('亦庄', 'Y-S-01'), ('亦庄', 'Y-S-002')]>
# 正向,就是从含有 ForeignKey 字段的表开始查
# 先获取到一个 QueySet 对象
qst = models.Cabinet.objects.filter(id=1)
# 再用 QuerySet 对象查询字段的值
# 结果是字典
qst.values("name","idc__name")
Out[53]: <QuerySet [{'name': 'Y-S-01', 'idc__name': '亦庄'}]>
# 结果是元组
qst.values_list("name","idc__name")
Out[54]: <QuerySet [('Y-S-01', '亦庄')]>
###############################################
# 反向查,表的映射类名称的小写
qst = models.IDC.objects.filter(id=1)
# 结果是字典
qst.values("name", "cabinet__name")
Out[58]: <QuerySet [{'name': '亦庄', 'cabinet__name': 'Y-S-01'}, {'name': '亦庄', 'cabinet__name': 'Y-S-002'}]>
# 结果是元组
qst.values_list("name", "cabinet__name")
Out[60]: <QuerySet [('亦庄', 'Y-S-01'), ('亦庄', 'Y-S-002')]>
网友评论