Django框架之鏈接數據庫及操做

Django框架之數據庫操做

一、靜態文件

一、什麼是靜態文件

網站所使用的提早已經寫好的文件,如:js,css,第三方組件bootstrap、fontawesome、sweetalter等等css

網站所用到的HTML文件統一放在templates文件夾中html

針對所用到的靜態文件放在static文件夾中,需手動建立前端

二、Django靜態文件配置

一、在settings配置文件中配置python

STATIC_URL = '/static/'  # 此處是訪問靜態資源的前綴,默認狀況下接口前綴名與靜態文件名保持一致
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), 
                    os.path.join(BASE_DIR, 'static1'),
                    ] # 此處的static是文件夾路徑,當訪問時,若是前綴相同,會從這個路徑下依次查找資源,都沒有會報錯

二、解決動態綁定問題mysql

在配置文件中STATIC_URL改變static名使前端的HTML代碼都不會改,在templates文件夾下全部HTML文件中動態引入綁定git

{% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

三、form表單中提交方式,默認是get請求,會自動將所請求的數據加在url後sql

http://127.0.0.1:8000/login/?username=admin&password=123

指定爲 method='post' 請求就不會在url後有請求的數據,而且全部的input標籤都要寫name屬性,不然後端接收不到所輸入的內容數據庫

action屬性django

一、不寫 默認朝當前地址提交數據bootstrap

二、全路徑

三、後綴(/login)

當發送post請求時,須要先配置文件中註釋掉一行

二、request對象方法

視圖函數應該作到針對不一樣的請求來作出不一樣的邏輯處理,好比GET請求應該返回一個HTML文件,POST請求應該獲取用戶提交的數據而後作一系列邏輯處理,因此咱們須要判斷請求方式是啥

request對象,用來獲取前端的請求方式

request.method  # 結果是GET或POST
request.POST  # 獲取post請求提交的數據 結果相似於一個大字典,字典的value是列表套字符串
request.POST.get('username')  # 只取列表中的最後一個元素,字符串
request.POST.getlist('username')  # 獲取整個列表
request.GET  # 獲取get請求url後攜帶的數據 結果相似於一個大字典,字典的value是列表套字符串
request.GET.get('username')  # 只取列表中的最後一個元素
request.GET.getlist('username')  # 獲取整個列表

注意:POST請求,便可以經過request.PSOT獲取數據,也能夠經過request.GET獲取攜帶的數據

一般狀況下針對不一樣的請求應該作不一樣的判斷,可是get請求次數要遠大於post請求,因此咱們應該對不是get請求的作判斷,對get請求不作判斷,減小代碼層次結構

def login(request):
    if request.method == 'POST':
        return HttpResponse('登陸請求收到')
    return render(request, 'login.html')

三、pycharm鏈接數據庫

 鏈接數據庫後能夠對數據庫中數據查看與修改數據

四、Django鏈接數據庫

須要本身手動先建立庫,Django支持MySQL5.5及以上版本

一、先去配置文件中配置相關的參數

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 數據庫類別
        'NAME': 'dome1',  # 庫名
        'HOST': '127.0.0.1',
        'POST': 3306,
        'USER': 'root',
        'PASSWORD': '2694',
        'CHARSET': 'utf8'
    }
}

二、在項目名或者應用名下面的__ init__文件中告訴Django使用pymysql鏈接數據庫而不是默認的自帶mysqldb

import pymysql
pymysql.install_as_MySQLdb()

五、Django的ORM簡介

Django的ORM不會幫你建立庫只能幫你建立表

ORM的做用:可以讓一個不會數據數據庫的也可以經過Python的面向對象方法,經過句點符來簡單快捷的操做數據

ORM對象關係映射:

類 <<===>> 表

對象 <<===>> 記錄

屬性 <<===>> 字段值

一、先去models.py文件中寫模型類

class User(models.Model):
    # id能夠不建立,Django ORM會自動建立一個名爲id的主鍵字段,若是本身建立了主鍵就不會自動建立
    # id int primary key auto_increment
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=64)  # 此處的char其實數據庫中的是varchar,且必須提供max_length
    password = models.CharField(max_length=32)
    email = models.EmailField(default='1321241@qq.com')  # 此處的EmailField在數據庫中是varchar(254)
    # price爲小數字段 總共8位小數位佔2位
    price = models.DecimalField(max_digits=8,decimal_places=2)

二、每一次從models類中對數據庫進行改變操做都要進行:數據庫遷移命令,兩條命令永遠成對出現,只要動了models.py對數據庫進行操做,就必需要執行數據庫遷移命令

  一、將數據庫的改動記錄到(migrations文件夾)中

    - python manage.py makemigrations

  二、將真正的改動同步到數據庫中

    - python manage.py migrate

六、字段的增刪改操做

一、字段的增長

兩種方式:

一、要麼給字段設置默認值

二、運行該字段爲空

 email = models.EmailField(default='1321241@qq.com')  # 設置默認值
 hobby = models.CharField(null=True, max_length=(64))  # 設置以前設置的字段默認爲空

二、字段的刪除

在models中註釋掉對應的字段,執行數據庫遷移命令便可

三、字段的修改

修改models中對應的代碼,執行數據庫遷移命令便可

七、數據的增刪改查操做

一、數據的增長

兩種方式:

一、create()    

     # 方式一:經過create方法添加數據
        user_obj = models.User.objects.create(username=username, password=password)

二、對象的綁定方法

  • 先生成一個user對象

  • 調用對象的綁定方法

        # 方式二:先生成一個user對象,再調用對象的綁定方法
        user_obj = models.User(username=username, password=password)
        user_obj.save()

二、數據的查找

一、查單條和多條指定的數據

filter()

from app01 import models
# 至關於SQL語句的select * from user where username='Mr沈'
res = models.User.objects.filter(username='Mr沈')  # 返回是一個列表套對象,且對象不存在時,不會報錯,返回空列表
user_obj = res.first()  # 支持索引取值不支持負索引,可是不建議使用,推薦使用first方法

filter()方法內能夠放多個關鍵字參數, 而且多個關鍵字參數之間是and關係

res = models.User.objects.filter(username='Mr沈', password='123')
# 至關於SQL語句的select * from User where username='Mr沈' and password='123'

二、查找全部

一、filter() 括號中不聽任何參數就是查全部

res = models.User.objects.filter()

二、all() 查詢全部的數據

res = models.User.objects.all()

三、刪除數據

先根據filter過濾出須要刪除的數據所有,再用delete() 方法刪除

models.User.objects.filter(id=delete_id).delete()

四、數據的修改

一、用戶如何獲取須要修改的數據id,能夠經過讓前端get請求中攜帶數據id來獲取

 <a href="/edit_user/?edit_id={{ user_obj.id }}">編輯</a>

二、根據數據id對數據進行批量修改,兩種方式:

一、方式1:update() 推薦使用

models.User.objects.filter(id=edit_id).update(name=username,password=password)

二、方式2:不推薦使用,由於會將數據庫全部的數據從新寫一遍,效率很慢

# 方式2(瞭解)
# 1 先獲取數據對象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 2 再修改對象屬性
edit_obj.name = username
edit_obj.password = password
# 3 調用對象的綁定方法保存
edit_obj.save()

 八、Django ORM表關係建立

表關係有:一對一,一對多,多對多

以圖書管理系統爲例創建各表之間的關係,圖書表、出版社表、做者表、做者詳情表

在書寫表關係的時候,要先把基表在models中所有寫出來,以後再考慮外鍵字段,最後要執行數據庫遷移命令

圖書表與出版社表:是一對多的外鍵關鍵關係,外鍵字段應該創建在多的那一方,ForeignKey(to= '')

# 書籍與出版社 是一對多外鍵關係
publish = models.ForeignKey(to='Publish')  # 默認關聯字段就是出版社表的主鍵字段
# publish = models.ForeignKey(to=Publish)  # to後面也能夠直接寫表的變量名 可是須要保證該變量名在當前位置的上方出現

圖書表與做者表:是多對多的外鍵關係,外鍵字段創建在哪張表上都行,外鍵字段推薦創建在查詢頻率較高的那張表中,爲了方便後面基於ORM查詢, ManyToManyField(to= '')

# 書籍與做者   是多對多外鍵關係
authors = models.ManyToManyField(to='Author')  # 書籍和做者是多對多關係
"""
authors字段是一個虛擬字段 不會真正的在表中建立出來
只是用來告訴django orm 須要建立書籍和做者的第三張關係表
"""

做者表與做者詳情表:是一對一的外鍵關係,外鍵字段創建在哪張表上都行,推薦創建在查詢頻率較高的那張表中,爲了方便後面基於ORM查詢,  OneToOneField(to= '')

# 一對一外鍵關係創建
author_detail = models.OneToOneField(to='AuthorDetail')

注意:ForeignKey字段和OneToOneFiled字段在建立表時無論用戶有沒有加_ id後綴都會自動在該字段名後加_id

 

 

 建立多對多表時,會自動建立第三張中間表

相關文章
相關標籤/搜索