1.我们使用models对数据库进行查询的时候,想去拿到结果的时候有时直接使用".字段",有时是'[0].字段',区别就是我们使用的语句返回的到底是一个对象还是列表:
obj=models.table.objects.all() obj=models.table.objects.filter() #以上结果都是一个列表,列表中每个元素就是一条数据的对象.所以这个时候就需要obj[角标].字段去获取我们想要的字段数据
obj=models.table.all().values("字段") obj=models.table.filter().values_list("字段") #加上values()获取到的也是列表,只是列表内的元素变成了字典,字典对应的数据就是我们values(字段)中字段的数据,想要使用也需要obj[角标]['字段']
#对于get(条件)拿到的就是对应条件的对象,想使用就是直接'obj.字段'就可以了,使用get的时候返回结果只能是有且只有一个对象,不然报错 models.table.objects.get(条件)
2.下划线__查询:
#1:下划线__用于条件,使用在filter()中 models.table.objects.filter(id__gt=0,id__lt=3)#查询id大于0小于3的结果 models.table.objects.filter(id__in[1,2,3])#查询id在某几个值中的结果 models.table.objects.filter(id__range()1,100))#查询id在某个范围 models.table.objects.exclude(id__range(1,100))#不在某个范围 #类似的还有: startswith,istartswith, endswith, iendswith,contains,icontains
#列举经典的书,作者,出版社模型 class People(models.Model): uname=models.CharField(max_length=32) age=models.IntegerField() class Book(models.Model): bname=models.CharField(max_length=32) author=models.ForeignKey('People') press=models.ManyToManyField("Press") class Press(models.Model): pname=models.CharField(max_length=32) address=models.CharField(max_length=16) #书和人是多对一,书和出版社是多对多的关系
#2-------------------下划线查询使用,正向,一对多,多对多查询------------------- #正向的意思就是你查询从带有多对一,多对多的表查询,这里就从book表查询就是作者或者出版社就是正向查询. #查询的方式很多种,这这里总结自己的经验就是先把查询语句用中文翻译出来, #比如现在我想"从book表查询出id=1的书的作者名字" #id=1是条件,条件字段是book表中的,所以不涉及到其他表,条件直接写filter(id=1) #作者名字是我们想要的结果,作者名字是其他表中的字段,这里就要跨表,所以下下划线就起了作用,values('author__uname'),主表中外键字段名字__字段名字,就可以跨表,代码如下:
models.Book.objects.filter(id=1).values('author__uname') #又比如我想'从book表查询出年龄大于20人的所有书' #这里年龄大于20的人是条件,而且跨表了,所以filter(author__age__gt=20) #的所有书是结果,书就在book表中,所以不需要跨表,直接写vlaues('bname') #代码如下:
models.Book.objects.filter(author__age__gt=20).values('bname') #--多对多--正向查询原理一样,如'从book表中查询出清华出版社出版的书的名字' #代码就是:
models.Book.objects.filter(press__pname='清华').values('bname')
#3---------下划线查询使用,反向,一对多,多对多------------------- #反向与正向相反,这里就是从people表或者press表反向查询书的相关内容,原则和正向查询一样,只是在条件和结果使用下划线的时候变成''表名字__字段名字'' #如"从people表中获取书名为'十万个为什么'"的作者. #条件'书名十万个为什么'在book表中,跨表了:filter(book__bname='十万个为什么') #想要的结果是作者,在people表中,不需要使用下划线跨表:values('uname') #代码:
models.People.objects.filter(book__bname='十万个为什么').values("uname")
3:对象查询
#许多时候我们并不能确定说查询到那个字段,而是先用get或者是列表[角标]获取到了对象,再更具具体使用再进行查询, 注意对象只能是一条数据,所以查询的条件对应对象有多个,就要分别用对象查询,麻烦,如果是条件对应多个对象,直接用下划线查询: #---------------------------------------------------对象,单表,一对多,多对多正向查询------------------ #单表:直接对象.字段获取: obj=models.People.objects.all() name=obj[0].uname #多对一查询'从book表查询到id=1的书的作者: #由于对象查询对象只能是一个,所以获取id=1的对象: obj=models.Book.objects.get(id=1) #再用对象查询到对应的作者: obj.author.uname#对象.外键字段名字.想要得到的字段名字,其中obj.auther是获取到与obj对象对应的author中的对象,是对象所以可以再次使用.uname #多对多查询 #'从book查询书籍id=1的所有出版社' obj=models.Book.objects.get(id=1) obj.press.values('pname')
#由于是多对多,obj.press是直接获取到了与id=1的press表中的数据,有可能是多个,所以不再是对象,进行查询就可以用filter(),get(),values()等,区别 与一对多
#----------------对象查询之反向查询--------------------- #反向查询表中没有其他表的字段,会用到对象.表名字_set进入到其他表(也可以在设置models的时候由related_name='xxx'换成xxx_set进入其他表) #一对多: #如"得到了id=1的人的对象,想查询他的所有书籍": obj=models.Press.objects.get(id=1)#获取对象 obj.book_set.values("bname") #多对多 #如'得到了id=1的出版社,查询该出版社的所有书籍': obj=models.Press.objects.get(id=1)#获取对象 obj.book_set.values("bname") #变化一下:"得到了id=1的出版社,查询该出版社的所有书籍的作者" obj=models.Press.objects.get(id=1)#获取对象 obj.book_set.values("people__uname")
4:一对多,多对多数据的增删.
---------------------一对多添加----------------------- #我们在创建foreignKey字段的时候,默认对应的是其他表的id字段,所以这个字段django在生成的时候会在我们的命名后面加上_id,我们这里的表结构book表中的author生成的字段名字就是author_id, #方法一:可以直接利用这个名字去创建 models.Book.objects.create(bname='xxx',author_id=1) #方法二:获取到对象再添加: "现在我们想添加一本书,书名'xx',作者yy'' #作者yy如果已经存在people表中,就直接获取该条数据的对象: obj=models.People.objects.get(pname=yy"") #再将该对象与书名xx绑定: models.Book.objects.create(bname='xxx',author=obj)#这里就直接写自己命名的字段了
----------------------------多对多数据添加删除------------------------- #多对多其实就是2个一对多,一般我们设置ManytoMany字段,django就帮我们生成了关系表,关系表的字段就是2个一堆多讲2个表连接起来,由于是django帮我们自动生成的第三张表,我们是不能直接操作第三张表的,所以会用到对象的add(),remove()等方法.
如果是自己手动添加的第三张表,就可以用一对多的方法添加 如"添加一本书,出版社是id=1和id=2的出版社" #首先创建一本书 首先获取到id=1和id=2的出版社 obj=models.Press.objects.filter(id__in=[1,2])#这里是一个列表集合 #获取书对象 bojb=models.Book.objects.create( bname="xxx", author_id=1, ) #正向添加就是: bobj.press.add(*obj) #反向添加就是 obj[0].book_set.add(bobj) obj[1].book_set.add(bobj)