添加表纪录
方式1
create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
方式2
book_obj=Book(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
book_obj.save()
def index(request):
#方式一
book=Book(name='红楼梦',pub_data='2015-10-12',price=88,publish='老男孩出版社')
book.save()
#方式二
Book.objects.create(name='Python红宝书',pub_data='2010-10-12',price=100,publish='人民出版社')
查询表纪录
查询API
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序('-id')
<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数据类型(类似于一个列表,里面放着一些对象)
# 1 方法的返回值是什么
# 2 方法的调用者
# (1) all方法 返回一个QuerySet对象
book_list=Book.objects.all()
print(book_list[1].name)
print(book_list)
for obj in book_list:
print(obj.name)
(2)first last:调用者是queryset对象,返回值是对象
book=Book.objects.all().first()
book2=Book.objects.all().last()
print(book)
print(book2)
(3) filter 返回值是queryset对象(相当于where语句)
可以加多个过滤条件
book=Book.objects.filter(name='红楼梦').first()
print(book)
(4)get方法 有且只有一个查询结果才有意义 返回值是一个对象
book=Book.objects.get(name='红楼梦')
print(book)
直接报错
book = Book.objects.get(name='红楼梦eee')
--------------最常用-----------------
(5)exclude 除了查询之外的 返回值也是queryset
ret=Book.objects.exclude(name='红楼梦')
print(ret)
(6)order_by(默认升序,加个- 就是降序),可以多个过滤条件调用者是queryset返回值也是queryset
book_list=Book.objects.all().order_by('id')
book_list=Book.objects.all().order_by('-id','price')
print(book_list)
(7)count() 调用者是queryset,返回值是int
ret=Book.objects.all().count()
print(ret)
(8)exist()判断是是否有值,不能传参数,
ret=Book.objects.all().exists()
print(ret)
# (9)values方法
# 查询所有书籍的名称(里面传的值,前提是表有这个字段)也是queryset但是里面放的是字典
'''
values原理
temp=[]
for obj in Book.objects.all():
temp.append({'name':obj.name})
'''
ret=Book.objects.all().values('name')
print(ret)
不加.all()也可以,调用是queryset返回值也是queryset
ret=Book.objects.values('price')
print(ret)
(10)value_list
ret=Book.objects.all().values_list('price','name')
print(ret)
(11) distinct seletc * 的时候没有意义
SELECT DISTINCT name from app01_book;
没有任何意义,不要这样么用
Book.objects.all().distinct()
ret=Book.objects.all().values('name').distinct()
print(ret)
基于双下划线的模糊查询
# 双下划线模糊查询-----------------------
# 查询价格大于100的书
ret=Book.objects.filter(price__gt=100)
print(ret)
# 查询大于50小于100的书
ret=Book.objects.filter(price__gt=50,price__lt=100)
print(ret)
# 查询已红楼开头的书
ret=Book.objects.filter(name__startswith='红楼')
print(ret)
# 查询包含‘红’的书
ret= Book.objects.filter(name__contains='红')
print(ret)
# icontains 不区分大小写
# 价格在50,88,100 中的
ret=Book.objects.filter(price__in=[50,88,100])
print(ret)
# 出版日期在2018年的
ret=Book.objects.filter(pub_data__year=2015,pub_data__month=2)
print(ret)
删除表纪录
删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:
model_obj.delete()
你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:
Entry.objects.filter(pub_date__year=2005).delete()
要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
Entry.objects.all().delete()
如果不想级联删除,可以设置为:
pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)
# delete:调用者可以是queryset也可以是model对象
# 删除价格为188的书有返回值 (1, {'app01.Book': 1}) 删除的个数,那张表,记录数
ret=Book.objects.filter(price=188).delete()
print(ret)
ret=Book.objects.filter(price=100).first().delete()
print(ret)
修改表纪录
Book.objects.filter(title__startswith="py").update(price=120
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
# 修改 update只能queryset来调用 返回值为int
ret=Book.objects.filter(name='红楼梦1').update(name='红楼梦')
print(ret)
报错
Book.objects.filter(name='红楼梦').first().update(name='红楼梦1')
ret=Book.objects.filter(name='红楼梦1').first()
print(ret.delete())
aa=Publish.objects.filter(name='人民出版社')
print(type(aa))
aa.delete()
return HttpResponse('ok')