美文网首页
django基础ORM

django基础ORM

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-09-25 19:20 被阅读0次

在 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')]>

admin后台管理

相关文章

网友评论

      本文标题:django基础ORM

      本文链接:https://www.haomeiwen.com/subject/nnayuctx.html