models的单表操作
一、数据库操作-增、删、改
- 数据库的操做无非就是增删改查
-
上面也看到我们的
-
1.1、models中创建数据库语句
-
- 建表
-
from django.db import models # Create your models here. # 准备书籍列表信息的模型类 class BookInfo(models.Model): # 创建字段,字段类型... name = models.CharField(max_length=20, verbose_name='名称') pub_date = models.DateField(verbose_name='发布日期',null=True) readcount = models.IntegerField(default=0, verbose_name='阅读量') commentcount = models.IntegerField(default=0, verbose_name='评论量') is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'bookinfo' # 指明数据库表名 verbose_name = '图书' # 在admin站点中显示的名称 def __str__(self): """定义每个数据对象的显示信息""" return self.name # 准备人物列表信息的模型类 class PeopleInfo(models.Model): GENDER_CHOICES = ( (0, 'male'), (1, 'female') ) name = models.CharField(max_length=20, verbose_name='名称') gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别') description = models.CharField(max_length=200, null=True, verbose_name='描述信息') book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键 is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') # class Meta: # db_table = 'peopleinfo' # verbose_name = '人物信息' def __str__(self): return self.name
-
-
插入数据
-
insert into book_bookinfo(name, pub_date, readcount,commentcount, is_delete) values ('射雕英雄传', '1980-5-1', 12, 34, 0), ('天龙八部', '1986-7-24', 36, 40, 0), ('笑傲江湖', '1995-12-24', 20, 80, 0), ('雪山飞狐', '1987-11-11', 58, 24, 0); insert into book_peopleinfo(name, gender, book_id, description, is_delete) values ('郭靖', 1, 1, '降龙十八掌', 0), ('黄蓉', 0, 1, '打狗棍法', 0), ('黄药师', 1, 1, '弹指神通', 0), ('欧阳锋', 1, 1, '蛤蟆功', 0), ('梅超风', 0, 1, '九阴白骨爪', 0), ('乔峰', 1, 2, '降龙十八掌', 0), ('段誉', 1, 2, '六脉神剑', 0), ('虚竹', 1, 2, '天山六阳掌', 0), ('王语嫣', 0, 2, '神仙姐姐', 0), ('令狐冲', 1, 3, '独孤九剑', 0), ('任盈盈', 0, 3, '弹琴', 0), ('岳不群', 1, 3, '华山剑法', 0), ('东方不败', 0, 3, '葵花宝典', 0), ('胡斐', 1, 4, '胡家刀法', 0), ('苗若兰', 0, 4, '黄衣', 0), ('程灵素', 0, 4, '医术', 0), ('袁紫衣', 0, 4, '六合拳', 0);
-
- 222
1.2、ORM-----增加
- 方式一:save()
-
语句示例
-
# 方式1 #1.先查询数据 # select * from bookinfo where id=1 book=BookInfo.objects.get(id=1) #2. 直接修改实例的属性 book.readcount=20 #3.调用save方法 book.save()
-
- 方式二:create返回一个对象,你的创建sql都保存在这个对象本身,再调用这个对象就会创建
- sql
-
# 方式二:create book = BookInfo.objects.create(name='python', pub_date='2021-08-06',commentcount=13,is_delete=0) # 生产创建sql book # 调用这个sql 创建
book = BookInfo.objects.create(name="php",pub_date='1888-01-01',readcount=12,commentcount=11,is_delete=0) book = BookInfo.objects.create(name='go') # 如果其他的参与没有添加 则默认为null,并不会报错 book
-
-
一般推荐第二种也
- 可以直接插入多条数据:
-
book = BookInfo.objects.create(name='阿威十八式', pub_date='2021-08-06',readcount= 27, commentcount= 34, is_delete=0) book = BookInfo.objects.create(name='全套不打折', pub_date='2021-08-06',readcount=21 , commentcount= 67, is_delete=0) book = BookInfo.objects.create(name='一人之下', pub_date='2021-08-06',readcount=899 , commentcount= 344, is_delete=0) book # 一次性将上述三条全部插入
-
1.1orm创建数据库
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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() 排序 默认熊小到大排序
默认从小到大: 也可以加减号 然后从大到小排序
BookInfo.objects.all().order_by('id') # 从小带大排序 BookInfo.objects.all().order_by('-id') # 带减号的就是desc从大到小排序 BookInfo.objects.all().order_by('id', 'name') #先按照id排序 然后相同的id再按照name排序
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、也可以直接指定下标来选择[ 下标]
print(BookInfo.objects.all()[2]) #取所有的数据中的querset中的第二个对象 print(BookInfo.objects.all()[4]) # 取所有的数据中的querset中的第四个对象
上面的都是精准匹配就是必须使用==才能匹配到 下面我们学习模糊匹配:
模糊匹配:
模糊匹配都会在前面加双下划线__
大于:__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本(前提存在足够数量的书籍)