1. 程式人生 > >67 orm13查詢語句,外鍵查詢,多對多查詢 單表查詢雙下劃線方法

67 orm13查詢語句,外鍵查詢,多對多查詢 單表查詢雙下劃線方法

ever tle 基礎 lte ron -s 執行流程 first 什麽

主要內容:https://www.cnblogs.com/maple-shaw/articles/9403501.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())  #刪除對應關系

  

  

  

67 orm13查詢語句,外鍵查詢,多對多查詢 單表查詢雙下劃線方法