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())  #删除对应关系

  

  

  

原文地址:https://www.cnblogs.com/gyh412724/p/9774692.html