Django連接數據庫(mysql)與Django ORM實操(增刪改查) 前端頁面


一:pycharm鏈接數據庫(MySQL)

1.pycharm右側Database工具欄
三個位置查找數據庫相關
	1.右側上方database
	2.左下方database
	3.配置里面的plugins插件搜索安裝
	
注意:	
	都沒有再沒有卸載pycharm重新裝	

07e79e4473abd8f9bb5bef9aa2644a2

2.下載對應的驅動,填寫MySQL數據庫信息連接(當前為客戶端)

pycharm可以充當很多款數據庫軟件的客戶端

24ba128f01911c4f4dfe88473d33273

3.pycharm連接MySQL數據庫

image

二:django鏈接數據庫(MySQL)

1.修改配置文件中數據庫設置成django連接MySQL

# django配置文件中默認用的是sqlite3數據庫
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}



# django鏈接MySQL(修改sqlite3數據庫)
	1.第一步配置文件中配置
  	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 修改成MySQL數據庫
        'NAME': 'day60',  # 連接數據庫名稱 先創建好才能指定
        'USER':'root',  # 數據庫名稱
        'PASSWORD':'admin123',  # 數據庫密碼
        'HOST':'127.0.0.1',  # 數據庫ip 本地回環地址
        'PORT':3306,  # 數據庫端口
        'CHARSET':'utf8'  # 指定字符編碼
    }
}
2.手動將默認mysqldb改為pymysql
2.代碼聲明 在項目文件夾或者應用文件夾內的__init__.py文件中書寫固定的代碼	
    django默認用的是mysqldb模塊鏈接MySQL
    但是該模塊的兼容性不好 需要手動改為用pymysql鏈接
    import pymysql
    pymysql.install_as_MySQLdb()  # pyMySQL取代MySQLDB

三:Django ORM

1.ORM簡介
"""
ORM:對象關系映射
作用:目的就是為了能夠讓不懂SQL語句的人通過python面向對象的知識點也能夠輕松自如的操作數據庫
缺陷:封裝程度太高,有時候sql語句的效率偏低,需要自己寫SQL語句
"""
類 ---------------->>> 表
對象 --------------->>> 表里面的數據
對象點屬性 ---------->>> 字段對應的值

image

2.模型類需要寫在應用下的models.py文件中
# 必須要繼承父類
class User(models.Model):
    #  id int primary_key auto_increment
    id = models.AutoField(primary_key=True)
    # username varchar(32)  # CharField必須要加max_length參數,不加報錯
    username = models.CharField(max_length=32) 
    # password int
    password = models.IntegerField()
3.數據庫遷移命令(非常重要)
打開terminal輸入命令   
********************************************************************
2 數據庫遷移命令  將操作記錄記錄到(migrations文件夾)
python3 manage.py makemigrations

2.將操作真正的同步到數據庫中
python3 manage.py migrate  
********************************************************************
警記*****:
    
只要你修改了models.py中跟數據庫相關的代碼 就必須重新執行上述的兩條命令
4.數據庫同步

image

image

5.針對主鍵字段
class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True,verbose_name='主鍵')
    # username varchar(32)
    username = models.CharField(max_length=32,verbose_name='用戶名')
    """
    CharField必須要指定max_length參數 不指定會直接報錯
    verbose_name該參數是所有字段都有的 就是用來對字段的解釋
    """
    # password int
    password = models.IntegerField(verbose_name='密碼')


     
class Author(models.Model):
    # 由於一張表中必須要有一個主鍵字段 並且一般情況下都叫id字段
    # 所以orm當你不定義主鍵字段的時候 orm會自動幫你創建一個名為id主鍵字段
    # 也就意味着 后續我們在創建模型表的時候如果主鍵字段名沒有額外的叫法 那么主鍵字段可以省略不寫
    # username varchar(32)
    username = models.CharField(max_length=32)
    # password int
    password = models.IntegerField()

image

四:字段的增刪改查

1.字段的增加
1.可以在終端內直接給出默認值
2.該字段可以為空
info = models.CharField(max_length=32,verbose_name='個人簡介',null=True)
3.直接給字段設置默認值
hobby = models.CharField(max_length=32,verbose_name='興趣愛好',default='study')
2.字段的修改
直接修改代碼 然后執行數據庫遷移的兩條命令即可!
3.字段的刪
直接注釋對應的字段然后執行數據庫遷移的兩條命令即可!
執行完畢之后字段對應的數據也都沒有了

刪除字段(注意):    
在操作models.py的時候一定要細心
千萬不要注釋一些字段
執行遷移命令之前最好先檢查一下自己寫的代碼

五:數據的增刪改查

1.查詢數據
# select * from user where username='jason':
user_obj = models.User.objects.filter(username=username).first()
"""
返回的結果是一個querySet對象 你可以把它看成是一個列表套數據對象格式
[數據對象1, 數據對象2...]
"""
它也支持索引取值 切片操作 但是不支持負數索引 
它也不推薦你使用索引的方式取值,而是使用封裝好的 .first()方法

filter括號內可以攜帶多個參數 參數與參數之間默認是and關系
你可以把filter連想成where記憶
  • views.py文件
from django.shortcuts import render, HttpResponse

from app01 import models
# 登錄
def login(request):
    # 返回一個登錄界面
    """
    get請求和post請求應該有不同的處理機制
    :param request: 返回請求方式 並且是全大寫的字符串形式
    :return:
    """
    if request.method == 'POST':
        # 獲取頁面用戶的用戶名和密碼 然后利用orm操作數據 效驗數據是否正確
        username = request.POST.get('username')
        # select * from user where username='jason':
        password = request.POST.get('password')
        # 去數據庫中查詢數據
        # print(password)
        # 1.導入models文件
        from app01 import models
        # 獲取數據庫內存儲的用戶名與密碼
        user_obj = models.User.objects.filter(username=username).first()
        # <QuerySet [<User: User object>]>  [數據對象1, 數據對象2...]
        if user_obj:
            # 頁面用戶輸入密碼對比數據庫存儲密碼是否一致
            if password == user_obj.password:
                return HttpResponse('登錄成功')
            else:
                return HttpResponse('密碼錯誤')
        else:
            return HttpResponse('用戶不存在')
    # GET返回html頁面文件
    return render(request, 'login.html')

image

2.添加數據
  • 第一種增加
from app01 import models
res = models.User.objects.create(username=username,password=password)
# 返回值就是當前被創建的對象本身
  • 第二種增加
# 類加對象實列化產生了對象
user_obj = models.User(username=username,password=password)
# 對象調封裝的方法 保存數據
user_obj.save()
3.注冊功能

def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 直接獲取用戶數據存入數據庫
        # 導入models
        from app01 import models
        res = models.User.objects.create(username=username,password=password)
        # 返回值就是當前被創建的對象本身
        print(res)

        # 第二種增加
        # 類加對象實列化產生了對象
        # user_obj = models.User(username=username,password=password)
        # 對象調封裝的方法 保存數據
        # user_obj.save()
    # 先給用戶返回一個注冊頁面
    return render(request,'reg.html')

image

六:前端(數據的查,改,刪)

1.需求
先將數據庫中的數據全部展示到前端 然后給每一個數據兩個按鈕 一個編輯一個刪除
2.查
# 展示用戶功能
def userlist(request):
    # 查詢出用戶表里面所以的數據
    
    # 方式1
    # data = models.User.objects.filter()  # filter類似於where

    # 方式2
    user_queryset = models.User.objects.all()  # 獲取表內所有數據
    # <QuerySet [<User: objk>, <User: oscas>, <User: zll>...]>
    
    # locals() 將當前名稱空間中的名字全部傳遞給html文件
    return render(request, 'userlist.html',locals())
3.改
1.點擊編輯按鈕朝后端發送編輯數據的請求
2.如何告訴后端用戶想要編輯哪條數據?
	將編輯按鈕所在的那一行數據的主鍵值發送給后端
	利用url問號后面攜帶參數的方式
  • 前端修改

    {# 當用戶點擊a標簽 a標簽會向edit_user 發送一個get請求 #}
    {# ?問號后面的參數不參與路徑匹配 獲取當前用戶點擊對應的主鍵值 #}
    <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
    <a href="" class="btn btn-danger btn-xs">刪除</a>
  • 后端修改
    # 修改數據的方式1
    # models.User.objects.filter(id=edit_id).update(username=username, 			password=password)
    """
    將filter查詢出來的列表中所有的對象全部更新  批量更新操作
    """

    # 修改數據的方式2
    edit_obj.username = username
    edit_obj.password = password
    edit_obj.save()
    """
    上述方法當字段特別多的時候效率會非常低
    從頭到尾將數據的所有字段全部更新一邊 無論該字段是否被修改
    """    
  • userlist.html
			<tbody>
                    {#模板語法 for + tab#}
                    {% for user_obj in user_queryset %}
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                         {# 當用戶點擊a標簽 a標簽會向edit_user 發送一個get請求 #}
                         {# ?問號后面的參數不參與路徑匹配 獲取當前用戶點擊對應的主鍵值 #}
                          <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
                         <a href="" class="btn btn-danger btn-xs">刪除</a>
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
后端查詢出用戶想要編輯的數據對象 展示到前端頁面供用戶查看和編輯
# 編輯用戶功能
def edit_user(request):
    # 獲取url問號后面的主鍵值參數
    edit_id = request.GET.get('user_id')

    # 查詢當前用戶想要編輯的數據對象
    edit_obj = models.User.objects.filter(id=edit_id).first()  # 拿到的是一個列表.first

    # 判斷用戶是否是POST請求
    if request.method == "POST":
        # 獲取用戶名和密碼
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去數據庫中修改對應的數據內容

        # 修改數據的方式1
        # models.User.objects.filter(id=edit_id).update(username=username, password=password)
        """
        將filter查詢出來的列表中所有的對象全部更新  批量更新操作
        """

        # 修改數據的方式2
        edit_obj.username = username
        edit_obj.password = password
        edit_obj.save()
        """
        上述方法當字段特別多的時候效率會非常低
        從頭到尾將數據的所有字段全部更新一邊 無論該字段是否被修改
        """
        # 跳轉到數據展示頁面
        return redirect('/userlist/')
    # 將數據對象展示到頁面上
    return render(request, 'edit_user.html', locals())

4.刪

# 刪除功能

models.User.objects.filter(id=delete_id).delete()
"""
delete:
    批量刪除
"""
def delete_user(request):
    # 獲取用戶想要刪除的數據id值
    delete_id = request.GET.get('user_id')
    # 直接去數據庫中找到對應的數據刪除即可
    models.User.objects.filter(id=delete_id).delete()
    """
    delete:
        批量刪除
    """
    # 跳轉到頁面
    return redirect('/userlist/')
知識儲備:
# 刪除數據內部其實並不是真正的刪除 我們會給數據添加一個標識字段用來表示當前數據是否被刪除了,如果數據被刪了僅僅只是將字段修改一個狀態
	username password	is_delete
  jason			123				0
  egon			123				1

七:實現效果

image


免責聲明!

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



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