Django框架之連接數據庫及操作


Django框架之數據庫操作

1、靜態文件

1、什么是靜態文件

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

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

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

2、Django靜態文件配置

1、在settings配置文件中配置

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

2、解決動態綁定問題

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

{% 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>

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

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

指定為 method='post' 請求就不會在url后有請求的數據,並且所有的input標簽都要寫name屬性,否則后端接收不到所輸入的內容

action屬性

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

2、全路徑

3、后綴(/login)

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

2、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')

3、pycharm連接數據庫

 連接數據庫后可以對數據庫中數據查看與修改數據

4、Django連接數據庫

需要自己手動先創建庫,Django支持MySQL5.5及以上版本

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

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

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

import pymysql
pymysql.install_as_MySQLdb()

5、Django的ORM簡介

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

ORM的作用:能夠讓一個不會數據數據庫的也能夠通過Python的面向對象方法,通過句點符來簡單快捷的操作數據

ORM對象關系映射:

類 <<===>> 表

對象 <<===>> 記錄

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

1、先去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)

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

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

    - python manage.py makemigrations

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

    - python manage.py migrate

6、字段的增刪改操作

1、字段的增加

兩種方式:

1、要么給字段設置默認值

2、運行該字段為空

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

2、字段的刪除

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

3、字段的修改

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

7、數據的增刪改查操作

1、數據的增加

兩種方式:

1、create()    

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

2、對象的綁定方法

  • 先生成一個user對象

  • 調用對象的綁定方法

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

2、數據的查找

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

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'

2、查找所有

1、filter() 括號中不放任何參數就是查所有

res = models.User.objects.filter()

2、all() 查詢所有的數據

res = models.User.objects.all()

3、刪除數據

先根據filter過濾出需要刪除的數據全部,再用delete() 方法刪除

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

4、數據的修改

1、用戶如何獲取需要修改的數據id,可以通過讓前端get請求中攜帶數據id來獲取

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

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

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

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

2、方式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()

 8、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

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM