1. 程式人生 > >Django----ORM 對錶單的操作

Django----ORM 對錶單的操作

---恢復內容開始---

---------------------------------

---------- 單表操作

---------------------------------

向資料庫的表單中新增內容的兩種方式

def addbook(request):
    # b=Book(name="python基礎",price=99,author="yuan",pub_date="2017-12-12")
    # b.save()      #新增內容的方式一

    Book.objects.create(name="老男孩shell",price=78,author="
oldboy",pub_date="2016-12-14") # 方式二 return HttpResponse("新增成功")

 

 

修改表單內容的兩種方式

def update(request):
    #表記錄的修改方式一 推薦用這種方式
    # Book.objects.filter(author="yuan").update(price="999")

    #表記錄的修改方式二
    b = Book.objects.get(author="oldboy")
    b.price=120
    b.save()
    
return HttpResponse("修改成功!")

 

刪除表單內容

def delete(request):

    Book.objects.filter(author="oldboy").delete()

    return HttpResponse("刪除成功!")

 

 

 

 

 

---------------------------------

Django檢視原生SQL語句logging配置----

--------------------------------------

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

 

 

表記錄的查詢

def select(request):

    # book_list=Book.objects.all()  #查詢列表所有資訊
    # print(book_list)
    # print(book_list[0])

    # book_list=Book.objects.all()[:3]  #取前三條
    # book_list=Book.objects.filter(id=2)  #得到的結果是一個集合,只不過只有一個id=2的物件
    # book_list=Book.objects.all()[::2]  #兩個兩個取,或者說是取一個,隔一個
    # book_list=Book.objects.first()  #取第一個
    # book_list=Book.objects.last()  #取最後一個
    # book_list=Book.objects.get(id=2)  #取一個id=2的物件,,如果按照作者取,加入有兩本書有同一個作者,會報錯

    ret = Book.objects.filter(author="yuan").values("name","price") #得到的結果是字典
    ret2 = Book.objects.filter(author="yuan").values_list("name","price") #得到的結果是元祖
    print(ret)
    print(ret2)

    #book_list=Book.objects.all().values("name).distinct() #去重
    book_count=Book.objects.all().values("name").distinct().count()
    print(book_count)

    #萬能的雙下劃線 __
    # book_list=Book.objects.filter(price__gt=50).values("name","price")  #__gt是大於,__lt小於
    book_list=Book.objects.filter(name__icontains="P").values("name","price")  #__icontains 包含大小寫p.contains只包含P




    return render(request,"index.html",{"book_list":book_list})

 

 

 

 

 

多表操作(一對多):

新增記錄:

Book.objects.create(name="linux運維",price=77,pub_date="2017-12-12",publish_id=2) #方式一

publish_obj=Publish.objects.filter(name="人民出版社")[0]
Book.objects.create(name="GO",price=23,pub_date="2017-5-12",publish=publish_obj)#方式二

 

查詢記錄(通過記錄):

  正向查詢:

   book_obj=Book.objects.get(name="python")

   pbu_obj = book_obj.publish------>書籍物件對應的出版社物件

   pub_obj.name

  反向查詢:

   pub_obj = Publish.objects.filter(name = "人民出版社")

   print(pub_obj.book_set.all().values("name","price"))

 

查詢記錄(filter values 雙下劃線__)

  ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
  print(ret)

  

ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
print(ret)

#求Python這本書的出版社的名字
ret2 = Publish.objects.filter(book__name="Python").values("name")
print(ret2)

ret3=Book.objects.filter(name="python").values("publish__name")
print(ret3)


#在北京的出版社出版過的書名
ret4= Book.objects.filter(publish__city="北京").values("name")
print(ret4)
#JAVA 這本書的出版社的所在城市
ret5 = Publish.objects.filter(book__name="JAVA").values("city")
print(ret5)

---------------------------------------------------------------------

 

多表操作(多對多)

  建立多對多關係:authors=models.ManyToManyField("Author")  (推薦)

  書籍物件的所有關聯作者  obj=book_obj.authors.all()

      繫結多對多關係      新增關係obj.add(*Queryset)                                 解除關係obj.remove(author_obj)

 

 

 

  手動建立第三張表

# class Book_Author(models.Model):
# book=models.ForeignKey("Book",on_delete=models.CASCADE)
# author=models.ForeignKey("Author",on_delete=models.CASCADE)


掌握:通過 filter values (雙下劃線)進行多對多的關聯查詢 (形式和一對多一樣)



    

  

多表查詢使用聚合函式前需要先倒入:

from django.db.models import Avg,Min,Sum,Max,Count