zoukankan      html  css  js  c++  java
  • 67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法

    主要内容:https://www.cnblogs.com/maple-shaw/articles/9403501.html

    练习题:https://www.cnblogs.com/maple-shaw/articles/9414626.html

    注意:  如果想要文件中运行整个django项目:

      需要在文件中写入:

    import os
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_operate.settings")
        import django
        django.setup()
    

    1 orm常用的13个查询语句:分为以下四种

      a : 获取对象列表: 

        obj = models.Person.objects.all()
        obj1 = models.Person.objects.filter(id=1)
        obj2 = models.Person.objects.exclude(name='alex')
        # values 比较特殊, 对象列表中不再是一个一个的对象, 而是一个字典, 里面放着建和值
        obj3 = models.Person.objects.all().values()
        # value_list 也比较特殊, 对象列表中也不在是对象, 而是一个元祖, 里面放着每一行的值,
        obj4 = models.Person.objects.all().values_list()
        # print(obj4)
        # 对对象排序, -号表示可以取反序.
        obj5 = models.Person.objects.all().order_by('id')
        # print(obj5)
        # 必须在已有排序的基础上进行排序
        # obj6 = models.Person.objects.all().order_by('id').reverse()
        # 第二种方法: 也可以在models中的MATA方法中的ordering设置根据什么排序
        obj6 = models.Person.objects.all().reverse()
        # print(obj6)
    

      b : 获取对象:

      # 如果该条件不存在或者产生多条数据都会报错, 一般不推荐使用.
        obj7 = models.Person.objects.get(id=1)
        # first获取第一个对象, 即对应的elast获取最后一个对象.
        obj8 = models.Person.objects.all().first()
        obj9 = models.Person.objects.all().last()
        # obj10 = models.Person.objects.create(name='哪吒', age=25)
        # obj10.save()
        # print(obj10)
    #     distinct  去重
    

      c : 返回数字

        obj11 = models.Person.objects.all().count()
    

      d : 返回布尔值

     obj12 = models.Person.objects.exclude(id=1).exists()
    

    2  外键查询

    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
        press = models.ForeignKey(to='Press', related_name='books', null=True)
    

      正向查询:

        1 . press_id和press.id的区别

        # obj1 = models.Book.objects.get(id=1)
        # print(obj1.press.id)          #从book表中取到press_id , 然后再找到press表中的id = press_id 的对象取出press.id
        # print(obj1.press_id)                                        #直接从book表里面取数据, 查找一次
    

        2 . 关联字段:  关联字段__字段(跨表)

      找到湖南出版社所出版的所有书籍
        books = models.Book.objects.filter(press_id=(models.Press.objects.get(name='湖南卫视出版社')).id)
    print(books) 执行流程: 先从 press表中取出id , 根据id = press_id再从book表中title   books = models.Book.objects.filter(press__name='湖南卫视出版社') #使用了连表查询, 查一次. print(books)
      print(models.Book.objects.values_list("press__name"))

      反向查询:

        1 . 获取管理对象:

          press_obj = press.objects.get(id = 1)

          press_obj.books           获取的是一个管理对象, 设置 related_name='books'

          press_obj.books.all() 获取的与该出版社相关的书籍对象列表

        2 . 设置和删除对应关系:

          obj1 = press.objects.get(id = 2)

          obj1.books.set(Book.objects.filter(id__in = [4, 5]))

          obj1.books.remove(*Book.objects.filter(id__in = [4, 5]))    press字段设置,  null = True

        3 . 关联字段:

           找出快乐大本营该书的出版社

            obj = models.Press.objects.filter(id=models.Book.objects.get(title='快乐大本营').press_id)

           print(obj)

           obj = models.Press.objects.filter(books__title='快乐大本营')   , #涉及到了一个连表查询, 查一次

           print(obj)

      

    3 多对对的查询:

        obj = models.Author.objects.get(id__in=[1])
        # print(obj)
        # print(obj.name)
        print(obj.books.all())
        # obj.books.set([2, 3])    # 设置对应关系
        # obj.books.add(2,3)
        obj.books.remove(*models.Book.objects.all())  #删除对应关系
    

      

      

      

  • 相关阅读:
    css
    js -【 数组】判断一个变量是数组类型的几种方法
    【消灭代办】第2周
    【本周面试题】第2周
    【本周面试题】第1周
    【消灭代办】第1周
    echarts
    css
    js
    JS方法
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9774692.html
Copyright © 2011-2022 走看看