表记录(增-删-改-查)
1,增
方式一:实例化对象就是一条表记录
save方法:翻译成SQL语句,然后调用pymysql,发送给服务端
Frank_obj = models.Student(name ="david",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save()
方式二:obj.create()创建
models.Student.objects.create(name ="路明非",course="python",birth="1995-5-9",fenshu=88)
2,删
delete()
models.UserInfo.objects.filter(id=7).delete() #queryset对象调用 models.UserInfo.objects.filter(id=7)[0].delete() #model对象调用
也可以一次性删除多个对象,每个Queryset都有一个delete()方法,他一次性删除所有Queryset对象
要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
删除所有对象
- …all().delete()
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象
3,改
方式一:update
models.UserInfo.objects.filter(id=2).update( name='芬格尔', checked = 0, )
方式二:save
ret = models.UserInfo.objects.filter(id=2)[0] ret.name = '芬格尔+2' ret.checked = 1 ret.save()
4,查
all():结果为Queryset类型
filter 条件查询
查询条件不能匹配到数据时,不会报错,返回一个空的queryset,<QuerySet []>
如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法
ret = models.Book.objects.filter(条件1,条件2...)
get():只找一个
ret = models.Book.objects.get() #得到的是一个model对象,有且只能有一个
查不到数据会报错 :Book matching query does not exist.
超过一个就报错 :returned more than one Book -- it returned 13!
exclude():排除
obj对象排除
models.Book.objects.exclude(title__startswith=‘。。。’)
寻找一类数据--Queryset
models.Book.objects.all().exclude(title__startswith='。。。')
order_by():排序
‘+’ 或者 ‘-’号表示两种方向,一种升序,一种降序,‘+’默认不写
models.Book.objects.all().order_by('-price','id') #orderby price desc,id asc;
reverse() :反转
数据排序之后才能反转
models.Book.objects.all().order_by('id').reverse()
count() :计数
统计返回结果的数量
models.Book.objects.all().count()
first():返回第一条数据,结果是model对象类型
ret = models.Book.objects.all().first()
last(): 返回最后一条数据,结果是model对象类型
ret = models.Book.objects.all().last()
exists(): 判断返回结果集是不是有数据
models.Book.objects.filter(id=9999).exists() #有结果就是True,没有结果就是False
values():返回的queryset,里面是字典类型数据
ret = models.Book.objects.filter(id=9).values('title','price') <QuerySet [{'title': '龙族8', 'price': Decimal('67.00')}]>
ret = models.Book.objects.filter(id=9).values() <QuerySet [{'id': 9, 'title': '龙族8', 'price': Decimal('67.00'), 'publishDate': datetime.date(2019, 9, 9), 'publishHouse': '江南出版社'}]>
value_list():返回的queryset,里面是数组类型数据
ret = models.Book.objects.all().values_list('title','price') <QuerySet [('龙族0', Decimal('59.00')), ('龙族1', Decimal('60.00')), ('龙族2', Decimal('61.00')), ('龙族3', Decimal('62.00')), ('龙族4', Decimal('63.00')), ('龙族5', Decimal('64.00')), ('龙族6', Decimal('65.00')), ('龙族7', Decimal('66.00')), ('龙族8', Decimal('67.00')), ('龙族9', Decimal('68.00')), ('龙族10', Decimal('69.00')), ('龙族11', Decimal('70.00')), ('龙族12', Decimal('71.00')), ('龙族13', Decimal('72.00')), ('龙族14', Decimal('73.00')), ('龙族15', Decimal('74.00')), ('龙族16', Decimal('75.00')), ('龙族17', Decimal('76.00')), ('龙族18', Decimal('77.00')), ('龙族19', Decimal('78.00')), '...(remaining elements truncated)...']>
ret2 = Book.objects.filter(id=9).values_list('title', 'price') <QuerySet [('龙族8', Decimal('67.00'))]>
distinct() :去重
配和values和values_list来使用
models.Book.objects.all().values('publish').distinct()
5,双下方法查询
Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象 Book.objects.filter(price__gt=100) 大于等于 Book.objects.filter(price__lt=100) 小于等于 Book.objects.filter(price__range=[100,200]) #sql的between and,大于等于100,小于等于200 Book.objects.filter(title__contains="python") #title值中包含python的 Book.objects.filter(title__icontains="python") #不区分大小写 Book.objects.filter(title__startswith="py") #以什么开头,istartswith 不区分大小写 Book.objects.filter(pub_date__year=2012)
某年某月某日: ret = models.Book.objects.filter(publish_date__year='2018') ret = models.Book.objects.filter(publish_date__year__gt='2018')#2018写数字也可以 ret = models.Book.objects.filter(publish_date__year='2019',publish_date__month='8',publish_date__day='1')
找字段数据为空的双下滑线 models.Book.objects.filter(publish_date__isnull=True) #这个字段值为空的那些数据