Python框架篇之Django(ORM對象關係映射)

一、認識ORM

1、概念:簡單來說,就是用面向對象的方式去操作數據庫的創建表以及增刪改查等操作。

2、ORM的優點

  • ORM使我們的通用數據庫交互變得簡單易行,完全不用考慮該死的SQL語句,實現快速開發
  • 可以避免一些新手程序猿寫SQL語句帶來的性能問題

3、表與表之間的關係
表與表之間的關係主要分爲:一對一、一對多、多對多

  • 一對一:在主外鍵(foreign key)的關係基礎上,給外鍵加了屬性

一個班級有很多學生,他們分別有不同的學號。一個學生對應一個學號,一個學號對應一個學生;通過學號能找到學生,通過學生也能得到學號,不會重複。這裏學生和學號的關係就是一對一

  • 一對多:就是主外鍵關係(foreign key)

一個班級有很多學生,可是這個班級只有一個班主任。在這個班級中回隨便找答一個人,就會知道他們的班主任是誰;知道了這個班主任就會知道有哪幾個學生。這裏班主任和學生的關係就是一對多。

  • 多對多:自動創建第三張表(當然我們也可以自己創建第三張表:兩個foreign key)

一個班級有很多學生,他們有語文課、數學課、英語課等很多課。一門課有很多人上,一個人上很多門課。這裏學生和課程的關係就是多對多。

  • 多對一:

比如說一個班級有很多學生,可是這個班級只有一個班主任。在這個班級中隨便找一個人,就會知道他們的班主任是誰;知道了這個班主任就會知道有哪幾個學生。這裏學生和班主任的關係就是多對一。

例如:書籍有書名和出版日期,一本書可能會有多個作者,一個作者也可以寫多本書,所以作者和書籍的關係就是多對多的關聯關係一本書只應該由一個出版商出版,所以出版商和書籍是一對多關聯關係,也被稱作外鍵。

二、模型常用字段類型

  • CharField:字符串字段, 用於較短的字符串.
    必要參數 maxlength, 用於從數據庫層和Django校驗層限制該字段所允許的最大字符數

  • IntegerField:用於保存一個整數.

  • FloatField:浮點數,必須的兩個參數:
    max_digits——總位數(不包括小數點和符號)
    decimal_places——小數位數

  • BooleanField:A true/false field. admin 用 checkbox 來表示此類字段

  • TextField:一個容量很大的文本字段

  • EmailField:帶有檢查Email合法性的 CharField,不接受 maxlength 參數

  • DateField:日期字段,有兩個非必須參數:
    Argument 描述
    auto_now 當對象被保存時,自動將該字段的值設置爲當前時間.通常用於表示 “last-modified” 時間戳

  • ImageField:類似 FileField, 不過要校驗上傳對象是否是一個合法圖片

  • FileField:文件上傳字段,要求一個必須有的參數: upload_to

  • URLField: 用於保存 URL. 若 verify_exists 參數爲 True (默認), 給定的 URL 會預先檢查是否存在( 即URL是否被有效裝入),沒有返回404響應

三、數據表的增刪改查

1、數據表記錄的添加

def addbook(request):
    # 第一種添加方法:實例化一個Book對象
    # b=Book(name="python進階",price=199,author="Lin",pub_date="2020-6-29")
    # b.save()

    #第二種添加方法:使用create
    Book.objects.create(name="澤法",price=98,author="okok",pub_date="2019-12-12")
    #Book.objects.create(**dic)
    #獲取全部前端發來的鍵值對加入到數據庫,前提是鍵值對的鍵名與數據表表頭字段必須一一對應

    return HttpResponse("添加成功")

2、數據表記錄的修改

def update(request):

    # 方法一:
    # 查找到author=“zahuw”,將對應的price改爲999
    Book.objects.filter(author="zahuw").update(price=999)

    # 方法二(效率低):get取一條記錄
    # b=Book.objects.get(author="zahuw")
    # b.price=120
    # b.save()
    # print(b)
    #用filter得到的集合就是一個:<QuerySet [<Book: Book object>]>對象集合
    # print(type(b))

    return HttpResponse("修改成功!")

3、數據表記錄的刪除

def delete(req):

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

    return HttpResponse("successfully")

4、數據表的查詢

def select(req):
    # 先獲取所有Book對象
    # book_list=Book.objects.all()
    # print(book_list)
    # print(book_list[0])#Book object取第一本書
    # book_list = Book.objects.filter(id=2) # 取id=2的書的集合(只要是filter就是取一個集合)
    # book_list = Book.objects.all()[:3]   # 用切片取前三本書
    # book_list = Book.objects.all()[::2]   # 設置步長爲2,隔兩本取一本
    # book_list = Book.objects.all()[::-1]  # 從後往前取
    # book_list = Book.objects.first()
    # book_list = Book.objects.last()
    # book_list = Book.objects.get(id=2)    # 只能取出一個對象
    
    # ret1=Book.objects.filter(author="zahuw").values("name")  # 取某個字段的值的鍵值對集合
    # ret2=Book.objects.filter(author="zahuw").values_list("name","price")  # 元組的集合
    # book_list=Book.objects.exclude(author="zahuw").values("name","price")
    # print(ret1)
    # print(ret2)

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

    #萬能的雙下劃線  __:用於模糊匹配

    # 過濾出price>=50的記錄
    # book_list=Book.objects.filter(price__gt=50).values("name","price")
    book_list=Book.objects.filter(name__contains="P").values_list("name","price")


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

四、配置日誌

每執行一次就會有記錄,需要我們在settings.py文件中加入以下代碼:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章