orm创建数据库
from django.db import models # Create your models here. class Book(models.Model): name = models.CharField(max_length = 30) price = models.DecimalField(max_digits=30,decimal_places=3) date = models.DateTimeField() publish = models.ForeignKey(to="Publish",to_field='id',on_delete = models.CASCADE) authors = models.ManyToManyField(to='Author') class Publish(models.Model): title = models.CharField(max_length = 30) addr = models.IntegerField() class Author(models.Model): name = models.CharField(max_length = 30) addr = models.CharField(max_length = 30) gf = models.OneToOneField(to='Gfriend',to_field='id',on_delete=models.CASCADE) class Gfriend(models.Model): name = models.CharField(max_length =30) age = models.IntegerField()
既然数据库已经建立完成那么 我们就可以对这个数据库进行操作了
先导入你新建立的models中的你建立的数据库表的名字
from one.models import Book 从新建立的app one中导入我建立的数据库的Book表
增加:
book_obj = Book (...)
book_obj.save()
第一种: book_obj = Book(name = '肉蒲团', price=30.6, publish ='老王出版社') book_obj.save() 这个当你为Book表添加完内容后必须要执行save 不然你的内容无法添加
第二种是直接添加的 比较简便;
添加记录的方式2:create返回记录对象
book_obj = Book.objects.create(name = '金瓶', price = 47.67, publish = '老刘头出版社') 就是直接调用object基类 然后create创建 即可
一般推荐第二种
也可以直接插入多条数据:
obj = Book.objects.create(name = 'python1',price=666,publish = '全栈出版社') obj = Book.objects.create(name = 'Python',price = 888,publish = '人工智能出版社') obj = Book.objects.create(name = 'python',price=999,publish = '数据分析')
查询表纪录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
< 1 > all (): 查询所有结果 < 2 > filter ( * * kwargs): 它包含了与所给筛选条件相匹配的对象 < 3 > get( * * kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 < 4 > exclude( * * kwargs): 它包含了与所给筛选条件不匹配的对象 < 5 > order_by( * field): 对查询结果排序 < 6 > reverse(): 对查询结果反向排序 < 8 > count(): 返回数据库中匹配查询(QuerySet)的对象数量。 < 9 > first(): 返回第一条记录 < 10 > last(): 返回最后一条记录 < 11 > exists(): 如果QuerySet包含数据,就返回 True ,否则返回 False < 12 > values( * field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 < 13 > values_list( * field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 < 14 > distinct(): 从返回结果中剔除重复纪录 |
对应的演示:
每一次在你的数据库中插入一条数据就在你的queryset中建立一个对象obj
1、 all()
s = Book.objects.all() 这样得到的是一个queryset这种特殊类型 # 返回的是一个queryset数据类型对象,类似于 [obj,obj,.....] 因为内部都是存储的都是对象那么取值可以用for s = Book.objects.all() for obj in s: print(obj.name)
2、 filter 返回的是一个queryset数据类型对象,[model_obj,.....]
其实filter就好比筛选的意思 它只能设置为等于来查找
s = Book.objects.filter(name = '金瓶') # print(s) # 得到<QuerySet [<Book: Book object (3)>]> for obj in s: #因为得到的是queryset你循环这个可迭代对象就取到里面的值就可以得到你想要的值了 print(obj.name)
3 、last first 根据切片来查找
last求最后一个 first求最后一个
obj = Book.objects.all().first() # print(obj) #Book object (1) print(obj.name) obj = Book.objects.all().last() print(obj.name)
4、get 方法返回的就是一个modle对象 (有且只有一个 结果的时候才有意义 也就是只能查找为1的时候的结果)
obj = Book .objects.get(id = 3) print(obj.name)
5、
exclude 排除的意思 和filter的差不多 filter是求出里面的条件 exclude是排除里面的值 并且都是得到queryset的类型
obj = Book.objects.exclude(name = '肉蒲团') #得到的也是queryset所以也要用for来求取值 for i in obj: print(i.name)
-
-
models.n.objects.all().order_by("-id") #带减号的就是desc从大到小排序
-
models.n.objects.all().order_by("id","-age") # 先按照id排序 然后相同的id再按照age排序
6、order_by() 排序 默认熊小到大排序
默认从小到大: 也可以加减号 然后从大到小排序
ret = Book.objects.all().order_by('price') #这个是求出所有并且按照价格来来排序 for i in ret: print(i.name)
-
-
models.n.objects.all().order_by("-id") #带减号的就是desc从大到小排序
-
models.n.objects.all().order_by("id","-age") # 先按照id排序 然后相同的id再按照age排序
从大到小用reverse()
ret = Book.objects.all().order_by('price').reverse() #把你的得到的结果翻转 就是按照从大到小的结果来排序 for i in ret: print(i.name)
7、
count 查找总数量
ret = Book.objects.all().count() # 查找总数量 print(ret)
8、exists查找是否有在里面 返回的是True 或者False
ret = Book.objects.all().filter(price = 30.60).exists() if ret: print('help me') else: print('nothing')
9、values () 把你想要得到的内容放置在一个列表嵌套字典中 字典的键就是你想要得到的内容
obj = Book.objects.all().values('name') # <QuerySet [{'name': '肉蒲团'}, {'name': '肉蒲团'}, {'name': '金瓶'}]> print(obj)
values一般用于你要取这个表的指定的这个字段 比如你要对这个表中的name这个列进行对比 ,那么就用values先取出这个列再进行对比
10、values_list() 和values用法一样只不过得到的内容不同 这个得到的是列表嵌套元组
obj = Book.objects.all().values_list('name','price') print(obj) #<QuerySet [('肉蒲团', Decimal('30.60')), ('肉蒲团', Decimal('30.60')), ('金瓶', Decimal('47.67'))]>
11、
distinct() 去重 根据你的条件去重 必须都满足
obj = Book.objects.all().values('name').distinct()
print(obj)
12、也可以直接指定下标来选择[ 下标]
obj = Book.objects.all().[3]
选择下标为3的对象
obj = Book.objects.all().[3,7]
这个是取到3-7的对象
上面的都是精准匹配就是必须使用==才能匹配到 下面我们学习模糊匹配:
模糊匹配:
模糊匹配都会在前面加双下划线__
大于:__gt:
book_list = Book.objects.filter(price__gt = 10) #大于__gt 匹配价格大于10 的物品 for i in book_list: print(i.name)
小于: __lt
obj = Book.objects.all().filter(price__lt = 35) #查找价格小于35的物品的名称 for i in obj: print(i.name)
大于等于:__gte
obj = Book.objects.all().filter(price__gte = 20) # 查找价格大于等于20的物品 for i in obj: print(i.name)
小于等于:__lte
obj = Book.objects.all().filter(price__lte = 50) # 查找价格小于50的物品 for i in obj: print(i.name)
范围:__range = [ ...]
range 可以等于[]也可以等于()
obj = Book.objects.all().filter(price__range = [10,100]) for i in obj: print(i.name)
以...开头 __startswith
obj = Book.objects.all().filter(name__startswith = '金' ) 查找名字是以金开头的物品 for i in obj: print(i.name)
以...结尾:__endswiths:
obj = Book.objects.all().filter(name__endswith = '团') # 查找名字是以团结尾的物品 for i in obj: print(i.name)
包含:__contains='包含内容' 这个是区分大小写 你规定大写就只能查到大写的 你规定小写的只能查到小写的
obj = Book.objects.all().filter(name__contains = '梅') #查找名字包含梅的名字 for i in obj: print(i.name)
obj1 = Book.objects.all().filter(name__contains = 'python')
for i in obj1:
print(i.name)
查找只含有小写的python的name
不区分大小写的查找__icontains = ''
obj = Book.objects.all().filter(name__icontains='Python') for i in obj: print(i.name)
这个是查找所有的含有python的name不区分大小写
Book.objects.
filter
(pub_date__year
=
2012
) 过滤年份
Book.objects.filter(pub_date__year=2012)
过滤你的pub_date的年份是2012的
修改表纪录:
根据你的查询内容修改只需要在你的查询条件后面加上update(修改内容)即可
Book.objects.filter(price__lte = 35).update(price=32)
这个是把你的价格小于35的全部改为32
删除表记录:
Book.objects.filter(price__lte = 35).delete()
删除价格小于35的物品
查询练习:
1 查询老男孩出版社出版过的价格大于200的书籍
2 查询2017年8月出版的所有以py开头的书籍名称
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
4 查询价格在100到200之间的所有书籍名称及其价格
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
6 查询价格大于200的书籍的个数
7 查询价格不等于100的所有书籍
8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)