zoukankan      html  css  js  c++  java
  • day 69 ORM 多表增删改查操作

     http://www.cnblogs.com/liwenzhou/p/8660826.html

     

     

     

     

     

     

     

    下面的代码是在 python console中配置的。 关闭pycharm会消失。

    from app01 import models
    models.Person.objects.all()
    <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

    在Python脚本中调用Django环境

     

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        from app01 import models
    
        books = models.Book.objects.all()
        print(books)


      1.查询所有人
      ret = models.Person.objects.all()
      print(ret)
      结果:
      <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

      
      2.get的查询方法

       ret = models.Person.objects.get(id =1)  #id为 不存在的话会报错
       print(ret)
      结果:
       小黑

      3.filter查询
      
       ret = models.Person.objects.filter(name ="小黑")
       print(ret)
       结果
      
    <QuerySet [<Person: 小黑>]>

        为什么会是这个结果因为:

         class Queryset(list):

      4. 查询id大于1的数据

        ret =models.Person.objects.filter(id__gt=1) #如果id等于100 ,不会报错,会返回一个空的QuerySet对象。

       print(ret)
       结果:

        <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>

      5.查询id等于1的数据,并取出里面的数据通过索引的方式取出来
      ret =models.Person.objects.filter(id=1)[0]
      print(ret)
      结果:
      
      小黑
       6.exclude

      
      print('exclude'.center(120,'*'))
      ret =models.Person.objects.exclude(id=1)
      print(ret)
      结果
      ********************************************************exclude*********************************************************

       <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>


      7.values(不写字段名,默认查询所有的字段)
      ret = models.Person.objects.values('birthday')
      print(ret)
      结果

       <QuerySet [{'birthday': datetime.date(2018, 5, 10)}, {'birthday': datetime.date(2018, 5, 25)}, {'birthday': datetime.date(2018, 5, 3)}]>

      8.values_list, 返回一个QuerySet对象,里面都是元组,不写字段,会查询所有

      ret = models.Person.objects.values_list('name','birthday')
      print(ret)
      结果

      <QuerySet [('小黑', datetime.date(2018, 5, 10)), ('小黑2', datetime.date(2018, 5, 25)), ('小黑6', datetime.date(2018, 5, 3))]>



      9 .order_by 对查询结果进行排序
      ret = models.Person.objects.all().order_by('birthday')
      print(ret)
      相当于设置元类 在Person类的下面
      
      class meta:
        ordering =(‘birthday’)

      结果
      <QuerySet [<Person: 小黑6>, <Person: 小黑>, <Person: 小黑2>]>
       10.reverse 将一个有序的QuerySet进行反转
      
      ret =models.Person.objects.all().order_by('birthday').reverse()
      print(ret)
      结果:

       <QuerySet [<Person: 小黑2>, <Person: 小黑>, <Person: 小黑6>]>


      11. count 返回QuerySet中对象的个数

      
      ret =models.Person.objects.all().count()
      print(ret)

      结果
      3

      12. first 返回QuerySet对象中第一个元素
      ret =models.Person.objects.first()
      print(ret)
      结果:
      小黑

      13. last 返回QuerySet对象中最后一个元素
      
      ret =models.Person.objects.last()
      print(ret)
      结果:  
      小黑6

      14. exist 判断表里面有没有数据
      ret =models.Person.objects.exists()#Person表中含有数据 返回True ,如果是空白则为False
      print(ret)
      结果:
      True ,




     二 、单表的双下划线查询

     

    1. 查询id值大于1 小于4的结果.
    ret = models.Person.objects.filter(id__gt=1,id__lt=4)

    print(ret)


    结果

    <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>



    2. IN 操作查询id在【1,3,5,6】
    ret = models.Person.objects.filter(id__in=[1,3,5,6])
    print(ret)
    结果:

    <QuerySet [<Person: 小黑>, <Person: 小黑6>]>


    3. exclude 排除在这些id的条目
    ret = models.Person.objects.exclude(id__in=[1,3,5,6])
    print(ret)

    结果:

    <QuerySet [<Person: 小黑2>]>

    4.  name_contains=  (name__icontains 忽略大小写)

    ret =models.Person.objects.filter(name__contains="6")
    print(ret)
    输出结果:

    <QuerySet [<Person: 小黑6>]>


    5. id_range =

    ret =models.Person.objects.filter(id__range=[1,2]) #相当于sql语句的between 1 and 2
    print(ret)
    结果:

    <QuerySet [<Person: 小黑>, <Person: 小黑2>]>

      6. 日期和时间字段还可以有以下写法

    ret =models.Person.objects.filter(birthday__year=2018)
    print(ret)
    ret =models.Person.objects.filter(birthday__month=5)
    print(ret)

    结果:

    <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
    <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

     

     三、正向查询

    # 外键的查询操作
    # 正向查询 方法一、 #基于对象 跨表查询 book_obj
    =models.Book.objects.all().first() ret = book_obj.publisher #出版社对象 print(ret,type(ret))
    ret
    =book_obj.publisher.name print(ret,type(ret)) # 和我这本书关联的出版社对象.

    结果:

      这是沙河第一出版社对象 <class 'app01.models.Publisher'>
      沙河第一出版社 <class 'str'>


    正向查询方法二、
    # 查询id是1的书的出版社的名称.
    #双下划线就表示跨了一张表.
    book_obj=models.Book.objects.filter(id=1).values('publisher__name')
    print(ret)
    结果:

     沙河第一出版社




     四、反向查询

      

    # # 反向查询。用set关键字  (基于对象 查询)
    publisher_obj =models.Publisher.objects.first()
    # ret =publisher_obj.book_set.all()    
    # print(ret)

    # #另外一种写法 (基于双下滑线) ret =publisher_obj.books.all() #books 为在Book类里设置的related_name 关键字的值 print(ret)

    结果:
    <QuerySet [<Book: 跟老男孩学linux>, <Book: java>]>


    related_name ='books' 反向查询是用来代替book_set的

    根据双下划线

    ret =modules.Publisher.objects.filter(id=1).value_list('ooxx__tile') #related_query_name ='ooxx'


      

     

    五、多对多查询. ManytoManyField 

    # 多对多 1.create
    author_obj = models.Author.objects.first()
    print(author_obj.name)
    #查询小黑1 写过的书
    ret =author_obj.books.all()
    print(ret)
    
    # 1. create
    # 通过作者创建一本书,会自动保存,
    # 做了两件事
    #1 。在book表里创建一本新书,2.在作者和书的关系表里添加关联
    author_obj.books.create(title ='金老板自传',publisher_id =2 )

    结果会在book表和book author关系表里自动添加数据。

     add

    # 2.add
    book_boj =models.Book.objects.get(id =8)
    author_obj.books.add(book_boj )
    
    # 添加多个
    book_objs =models.Book.objects.filter(id__gt=5)
    author_obj.books.add(*book_objs) #要把列表打算再传进去.
    #直接添加id
    author_obj.books.add(9)

    remove

    # remove 从金老板关联的书里吧开船删掉
    # book_obj=models.Book.objects.get(title='gen金老板学开船')
    # author_obj.books.remove(book_obj)
    
    book_obj =models.Book.objects.get(title="java")
    print(book_obj)
    author_obj.books.remove(book_obj)
  • 相关阅读:
    Hibernate的一些操作
    工作心得
    放款流程
    关于C#事件的自我构想和学习
    委托之winForm窗口间传递数据
    C#中string[]数组和list<string>泛型的相互转换 【转】
    关于注册界面中的一些规则设计时要注意
    系统界面设计---风格
    关于系统注册,做卡号重校验
    关于系统设计中的硬件开发
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/9037927.html
Copyright © 2011-2022 走看看