1. 程式人生 > >Django——模型基礎ORM 資料庫連線配置 模型的建立與對映 資料的增刪改查

Django——模型基礎ORM 資料庫連線配置 模型的建立與對映 資料的增刪改查

Django

  1. Django的ORM簡介
  2. 資料庫連線配置
  3. 模型的建立與對映
  4. 資料庫的增刪改查
    1. 增資料
    2. 查資料及補充
    3. 改資料
    4. 刪資料

 

 

Django的ORM系統分析

  1. ORM概念:物件關係對映(Object Relational Mapping,簡稱ORM)
  2. ORM的優勢:不用直接編寫SQL程式碼,只需像操作物件一樣從資料庫操作資料。

Django的模型對映關係

  • 模型類必須都寫在app下的models.py檔案中。
  • 模型如果需要對映到資料庫,所在的app必須被安裝.
  • 一個數據表對應一個模型類,表中的欄位,對應模型中的類屬性.

 


 

 

資料庫的配置

 在專案的settings檔案中的DATABASES

注意:NAME是資料庫的庫名,在使用之前,需要先在資料庫中新建一個對應名字的database

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.msyql',
        'NAME': database_name,
        'USER': username,
        'PASSWORD
': password, 'HOST': '127.0.0.1', 'PORT': '3306' } }

 

  •  建立一個管理員使用者pywjh賬號,密碼為 pywjh:CREATE USER 'pywjh'@'%'IDENTIFIED BY 'pywjh';
  • 給這個使用者授予所有遠端訪問,這個使用者主要用於管理整個資料庫,備份,還原等操作。
    • GRANT ALL ON *.* TO 'pywjh'@'%';
  • 使授權立即生效:FLUSH PRIVILEGES;

 

pymsql資料庫聯結器的配置

設定聯結器為pymysql:
主目錄下的的__init__.py檔案新增下面兩句

import pymysql
pymysql.install_as_MySQLdb()

 




使用Django中的模型

 首先,在哪個APP下建立模型,都要先在settings中註冊APP

APP  my_sql下的models.py

from django.db import models


# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True) # id屬性,不用新增Django也會自動新增
    name = models.CharField(max_length=10)
    age = models.IntegerField()

    def __str__(self):   # 定義輸出方法,在查詢的時候使用
        return 'User<id=%s, name=%s, age=%s>'%(
            self.id, self.name, self.age
        )

 

 然後在建立對映檔案:( 後面可以跟APP的名字,不跟則表示全部都對映)
python manage.py makemigrations [app_name]

將對映資料提交到資料庫中:

python manage.py migrate [app_name]

 

 這是就會在資料庫中看到自己建立的模型

開啟資料我們能看到建立的以app名_模型名的資料表,而其他的一些表格是django自動生成的.
注意:如果要刪除表,那麼可以去django模型中註釋掉模型類,然後執行對映的命令,不要手動在命令列裡面去刪除.


 

 

 資料庫的增刪改查

增:

 配置到url後,在檢視views中:

from django.http import HttpResponse
from .models import User

def add(request):
    # # 方法一
    # user = User()
    # user.name = '張三'
    # user.age = 22
    # user.save()
    # # 方法二
    # user = User(name='李四', age=23).save()
    # # 方法三
    # User.objects.create(name='王五', age=22)
    # 方法四
    User.objects.get_or_create(name='週六', age=24) # 這個方法不會重複新增

    return HttpResponse('新增資料成功')

 檢查資料庫:

 

查:

views中:

檢視全部資料

from django.http import HttpResponse
from .models import User

def get(request):
    # 獲取全部資料
    result = User.objects.all()
    print(result)
    return HttpResponse('查詢資料成功')

User.objects.all()——後臺輸出:

查詢一個數據:

def get(request):
    # 查村一個數據
    result = User.objects.get(id=1)
    print(result)

    return HttpResponse('查詢資料成功')

 

查詢滿足條件的資料:

def get(request):
    # 查詢滿足條件的資料
    result = User.objects.filter(name='王五')
    print(result)

    return HttpResponse('查詢資料成功')

 

注意:

  • 通過print可以在後臺看到我們訪問到的資料,並且輸出方式就是模型中的__str__的格式.
  • all()和filter()方法返回的是QuerySet物件.
  • get()方式返回的單個物件,如果符合條件的物件有多個,則get報錯!
  • 1.從資料庫中查詢出來的結果一般是一個集合,這個集合叫做 QuerySet.
  • 2.QuerySet是可迭代物件.
  • 3.QuerySet支援切片, 不支援負索引.
  • 4.可以用list強行將QuerySet變成列表.

補充:

獲取一個屬性的搜尋資料:

def get(request):
    # 單獨獲取一個屬性的全部資料
    result = User.objects.values('age')
    print(result)

    return HttpResponse('查詢資料成功')

去重:

def get(request):
    # 單獨獲取一個屬性的全部資料,並去重
    result = User.objects.values('age').distinct()
    print(result)

    return HttpResponse('查詢資料成功')

 

 

改:

在操作之前,先在models中在新增一個city的屬性,規定模型新增屬性要加上預設值,不要忘記建立對映檔案已經對映資料

from django.db import models


# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    city = models.CharField(max_length=20, default='北京')

    def __str__(self):
        return 'User<id=%s, name=%s, age=%s>'%(
            self.id, self.name, self.age
        )

對映檔案以後再檢視資料庫:

views:

def update(request):
    # 先查詢到資料在進行修改
    res = User.objects.get(name='張三')
    res.city = '武漢'
    res.save()
    # 用update直接修改 # update針對的是QuerySet型別的資料
    User.objects.filter(name='李四').update(city='重慶')
    return HttpResponse(' 資料修改成功')

 

刪:

所有的方法都是用與delete方法

def delete(request):
    result = User.objects.get(id=1)
    result.delete()

    User.objects.filter(name='週六').delete()
    return HttpResponse('刪除資料成功')