zoukankan      html  css  js  c++  java
  • Django_models下划线__正反查询,对象正反查询

    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)
  • 相关阅读:
    放假期间网站被挂马的解决办法
    放假期间网站被挂马的解决办法
    判断一个字符串中字母的个数(无视大小写)
    判断一个字符串中字母的个数(无视大小写)
    JSP 9 大内置对象详解
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    2019年企业数据生产力调研报告,90%的人都没看过
    2019年12月数据库流行度排行:前三甲高位收官 数据库重获增长趋势
  • 原文地址:https://www.cnblogs.com/guoguojj/p/8326200.html
Copyright © 2011-2022 走看看