欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django 过滤器-查询集-比较运算符-FQ对象-mysql的命令窗口

程序员文章站 2023-11-09 18:00:34
""" 返回查询集的方法称为过滤器 all() 返回查询集中所有数据 filter() 返回符合条件的数据 一、filter(键=值) 二、filter(键=值,键=值) #两个关系为and 三、filter(键=值).filter(键=值) #两个关系为and exclude()过滤掉符合逻辑的数 ......
"""
返回查询集的方法称为过滤器
all()
返回查询集中所有数据
filter() 返回符合条件的数据
一、filter(键=值)
二、filter(键=值,键=值)   #两个关系为and
三、filter(键=值).filter(键=值)   #两个关系为and
exclude()过滤掉符合逻辑的数据
order_by()排序
values()一条数据就是一个对象{字典},返回一个列表

返回单个数据:
get() 返回一个满足条件的对象
注意:如果没有找到符合条件对象,会引发“模型类.doesnotexist异常”
     如果找到多个对象,也会引发“模型类.multipleobjectsreturnen异常"
count()  返回查询集中的对象个数
first()  返回查询集中的第一个对象
last()   返回查询集中的最后一个对象
exists()  判断查询集中是否有数据,如果有返回true,没有返回false

限制查询集 返回列表,可以使用下标的方法进行限制,注意下标不能是负数
students_list = students.stuobj.all()[0:5]  这个是显示5条记录
下面是分页显示5条记录
#0-5 6-10
# 1   2
page = int(page)
students_list = students.stuobj.all()[(page-1)*5:page*5]

查询集的缓存
概述:每个查询集都包含一个缓存,来最小化对数据加访问
    在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,django会将查询出来的数据做一个缓存,并返回查询结构,以后查询的直接查询查询集的缓存

字段查询
概述
1.实现了sql中的where语句,作为方法filter(),exclude(),get()参数
2.语法:属性名称__比较运算符=值
3.外键:属性名_id
4.转义:like语句在sql中使用%是为了匹配点位,匹配数据中的%(where like ‘\%‘)
filter(sanme__contains‘%‘)


比较运算符:
exact:判断,大小写区分,例:filter(isdelete=flase)
contains:包含,大小写区分,例:students_list=students.stuobj.filter(sname__contains="小")
startswith和endswith:以values开头或者结尾的查询,大小写区分,例:students_list=students.stuobj.filter(sname__startswith="小")
以上四个开头加上i,就不区分大小写,iexact,icontains,istartswiht,iendswith
isnull,isnotnull:是否为空的意思,例:filter(sname_isnull=false)
in:是否包含在范围内,例:students_list=students.stuobj.filter(pk__in=[2,4,6])
gt,gte,it,ite:分别为,大于,大于等于,小于,小于等于,例:students_list=students.stuobj.filter(sage__gt=30)
year,month,day,week_day,hour,minute,second:日期筛选,例:students_list=students.stuobj.filter(latetime__year=2017)

跨关联查询:
处理join查询,语法:模型类名__属性名__比较运算符
描述中带有"小李"这两个字的数据是属于那个班级的
students_list = grades.gra_guanli.filter(students__scontend__contains=‘小李‘)
print(students_list)

查询快捷:
pk  ---  代表主键

聚合函数:
使用aggregate()函数返回聚合函数的值
aug
count
max
min
sum
使用时候,需要先引入,例,取最大的年龄:
from django.db.models import max
studentage = students.stuobj.aggregate(max(‘sage‘))
print studentage
打印结果:{‘sage__max‘: 34}  #是个字典


f对象:
可以使用模型a属性与b属性进行比较
也是需要先引入
from django.db.models import f
def grades3(request):
    g = grades.gra_guanli.filter(ggirlnum__gt=f(‘gboynum‘))
    print(g)
    return httpresponse("kkk")
支持f对象的算术运算
    g = grades.gra_guanli.filter(ggirlnum__gt=f(‘gboynum‘)+20)


q对象:
概述:过滤器的方法中的关键字参数,条件为and模式
需求:进行or查询
解决:使用q对象,这个是或的关系,只两个条件有一个符合都会显示
from django.db.models import q
def studentsearch(request):
    g = students.stuobj.filter(q(pk__gt=7) | q(sage__gt=30))
    print (g)
    return httpresponse(‘jj‘)
如果只有一个q对象,就是用于匹配
g = students.stuobj.filter(q(pk__gt=7))
如果q对象前面再个波浪线,就是用于取反
g = students.stuobj.filter(~q(pk__gt=7))











如果更改django的代码,终端需要重新进入,并重新加载下面,终端区分大小写

from xinapp.models import grades,students
from django.utils import timezone
from datetime import *

查所有数据  类名.objects.all()

给表传数据
grade1 = grades()
grade1.gname = "pingguo"
grade1.gdate = datetime(year=2017,month=7,day=17)
grade1.ggirlnum = 8
grade1.gboynum = 30
grade1.save()
.....

查询数据某一个数据
类名.objects.get(pk=num)
grades.objects.get(pk = 2) #相当于id = 2

修改某一个表的数据
模型对象.属性=新值
grade1.gboynum =80
grade1.save()

删除某个表的数据
模型对象.delete()
物理删除(数据库中表的数据真实被删除)
grade2.delete()

关联外键(注意,表中的字段都必须赋值才能正常保存,否则会出错)
grade1 = grades()
grade1.gname = "ceshi"
stu = students()
stu.sname = "ksjdfk"
stu.models.foreignkey = grade1

获取班级关联的学生
模型对象名.关联的类名小写_set.all()
grade1.students_set.all()

通过关联直接创建学生(如果中文需要转码u‘中文‘,英文不用,它会直接存入数据库,不需要使用save())
并且直接属于grade1的学生!
stu3 = grade1.students_set.create(sname=u‘曾志伟‘,sgender=true,scontend=‘shuoming‘,sage=77)

启动服务器
python manage.py runserver




mysql的命令窗口,这个是没有区分大不小写的

删除除数据库
drop database 表名; 数据库名
创建数据库
create database  表名; 数据库名
展示所有数据库名称
show databases;
使用数据库
use 数据名;
展示数据库下面的所有表名称
show tables;
展示表的所有字段结构
desc 项目_表名
查询表的具体的内容
select * from 表名(例:xinapp_grades);

django中数据库基本操作:
1.同步数据库
python manage.py makemigrations  #生成migrations
python manage.py migrate   #应用migrations
2.增
model.objects.create(**kwargs)
3.查
model.objects.all()
4.改
m = model.objects.get(id=1)
m.name = ‘new_name‘
m.save()
5.删
m = model.objects.get(id=1)
m.delete()
3.数据库的基本操作
3.1 增
我们先为shopping mall增加一个化妆品区:
复制代码
from django.shortcuts import httpresponse
from .models import area
def add_area(request):
    area = area.objects.create(name=‘cosmetic‘, description=‘充满香味儿的区域‘)
    return httpresponse(‘added!‘)
复制代码
其中,第六行代码 area = area.objects.create(name=‘cosmetic‘, description=‘充满香味儿的区域‘)

所对应的mysql语句为:

insert into shop_area(name,description) values(‘cosmetic‘,‘充满香味儿的区域‘);
3.2 查

现在,我们来列出shopping mall中的所有区域:

复制代码
1 from django.shortcuts import httpresponse
2 from .models import area
3
4
5 def list_area(request):
6     area = area.objects.all()
7     print(area)                    # 在shell输出[<area: ‘cosmetic‘>],如果没有定义__str__(),将输出无意义的[<area: area object>]
8
9     return httpresponse(‘listed!‘)
复制代码
第六行代码 area = area.objects.all()

相当于mysql语句:

select * from shop_area;
复习一下:shop_area为django为模型自动生成的表名(app_model)
3.3 改
在3.1中,我们并没有为化妆品区指定管理人员。现在,我们修改化妆品区的信息,将rinka指定为管理人员。

首先,我们要创建一个rinka用户。这里我将创建一个名为rinka的superuser:

python manage.py createsuperuser


接着,将我们创建的rinka用户指定为化妆品区的管理人员:

复制代码
 1 from django.shortcuts import httpresponse
 2 from .models import area
 3 from django.contrib.auth.models import user
 4
 5
 6 def update_area(request):
 7     rinka = user.objects.get(username=‘rinka‘)
 8     area = area.objects.get(id=1)
 9     area.manager = rinka
10     area.save()
11
12     return httpresponse(‘updated!‘)
复制代码
注意必须调用对象的save()方法,对对象实例的修改才会保存到数据库中去。这是一个容易出错的地方。

第8~10行代码对应的mysql语句为:

update shop_area set manager_id=1 where id=1;
复习一下:manager_id为django默认为外键生成的列名(foreignkey_id)
3.4删

删除操作很简单,我们现在来删除数据库表shop_area中id为1的那行数据:
复制代码
1 from django.shortcuts import httpresponse
2 from .models import area
3
4
5 def delete_area(request):
6     area = area.objects.get(id=1)
7     area.delete()
8
9     return httpresponse(‘deleted!‘)
复制代码
第6~7行语句对应的mysql语句为:
delete from shop_area where id=1;

模型类中定元选项(meta类):
db_talbe 定义数据表名,如果不定义, 默认是项目名小写_类名小写
ordering 取数据时显示的顺充  正数为顺序,前面加负号为反序,排序会增加数据库资源
    class meta:
        db_table="students"
        ordering=["-id"]




"""