Django視圖之ORM操作(一) ---- 第9章


左上角的關注按鈕沒,不要覺得麻煩哦,點擊上面的關注按鈕快關注我吧,你的關注就是我不懈的動力!

1. ORM的功能

Django的ORM可以操作數據庫的表結構和數據行。操作表結構體現在創建表、修改表和刪除表,操作數據行則體現在對錶的CURD操作,也就是增刪改查。Django的ORM本身不支持連接數據庫,實質上使用的是第三方工具如 pymysql 或者是 sqlalchemy 來連接數據庫

2. 數據庫設置

Django默認使用的是SQLite,也是Django中自帶的數據庫,但是我們一般不會使用。我們通常會使用SQLite之外的數據庫,如mysql、oracle、postgresql等。所以,需要在Django中修改默認使用的SQLite爲其它的數據庫。在 settings.py 中找到 DATABASES 變量:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

如果使用的是mysql數據,修改爲:

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '數據庫的名稱',
        'USER': '用戶名',
        'PASSWORD': '密碼',
        'HOST': '數據庫地址',
        'PORT': '數據庫端口'
    }
}

設置ORM使用 pymysql 連接數據庫,只需要在與 settings.py 同級目錄下的 __init__.py 這個空文件中寫入:

import pymysql
pymysql.install_as_MySQLdb()

配置文件 setting.py 中的 INSTALLED_APPS 下包含了在Django實例中激活的所有Django應用程序的名稱,這些應用程序都是隨Django一起提供的:

django.contrib.admin:管理站點

django.contrib.auth:認證系統

django.contrib.contenttypes :內容類型的框架

django.contrib.sessions:會話框架

django.contrib.messages:消息傳遞框架

django.contrib.staticfiles:用於管理靜態文件的框架

這些應用中的一些應用程序 至少使用一個數據庫表,因此我們需要在數據庫中創建表之後才能使用它們,執行下面的命令來創建:

(django_test) thanlon@thanlon:~/projects/PycharmProjects/django_test$ python manage.py migrate

可以在數據庫看到創建的數據表:

mysql> show tables;
+----------------------------+
| Tables_in_django_test      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

migrate命令獲取所有尚未應用的遷移(Django使用名爲的特殊表在數據庫中跟蹤應用了哪些遷移django_migrations),並針對數據庫運行它們。本質上,將你對模型所做的更改與數據庫。遷移功能非常強大,可以在開發項目時隨時間更改模型,而無需刪除數據庫或表並創建新的模型。它專門用於實時升級數據庫而不會丟失數據。

3. makemigrations和migrate

接下來需要到模型中創建類和字段,創建完成後需要先使用 python manage.py makemigrations 命令來爲數據表的更改創建遷移,然後使用 python manage.py migrate 將更改應用到數據庫。之所以使用單獨的命令來進行和應用遷移,是因爲你會將遷移提交到版本控制系統,並隨應用程序一起交付。這些單獨的命令不僅使您的開發更加容易,而且還可以被其他開發人員和生產環境使用

4. ORM創建數據表

models.py 文件中寫模型,這裏分別創建員工表和部門表:

from django.db import models

class Depart(models.Model):
    """
    創建部門表
    """
    title = models.CharField(max_length=32, unique=True)

class EmpInfo(models.Model):
    """
    創建員工信息表
    """
    # 主鍵默認是id,寫與不寫名字都是id,類型是int且爲主鍵和自動遞增
    nid = models.AutoField(primary_key=True)
    username = models.CharField(max_length=32)
    pwd = models.CharField(max_length=64)
    # 'max_length' is ignored when used with IntegerField.
    age = models.IntegerField()
    # 會自動創建dp_id字段
    dp = models.ForeignKey("Depart", on_delete=models.CASCADE, null=True)

執行創建遷移和應用更改的命令後會創建兩張表:

部門表:
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| title | varchar(32) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
員工表:
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| nid      | int         | NO   | PRI | NULL    | auto_increment |
| username | varchar(32) | NO   |     | NULL    |                |
| pwd      | varchar(64) | NO   |     | NULL    |                |
| age      | int         | NO   |     | NULL    |                |
| dp_id    | int         | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

生成遷移記錄和應用遷移有問題可以在評論區留言!

5. ORM單表CURD

數據的增加:

from django.shortcuts import render, HttpResponse, reverse
from app01 import models

# Create your views here.
def index(request):
    models.Depart.objects.create(title='技術部')
    models.Depart.objects.create(title='運維部')
    models.EmpInfo.objects.create(username='Thanlon', pwd='123456', age=23, dp_id=3)
    return render(request, 'index.html')
部門表:
+----+-----------+
| id | title     |
+----+-----------+
|  2 | 技術部    |
|  1 | 運維部    |
+----+-----------+
員工表:
+-----+----------+--------+-----+-------+
| nid | username | pwd    | age | dp_id |
+-----+----------+--------+-----+-------+
|   1 | Thanlon  | 123456 |  23 |     1 |
+-----+----------+--------+-----+-------+

數據的查詢:

from django.shortcuts import render, HttpResponse, reverse
from app01 import models

def index(request):
    # 查詢所有部門信息
    dp_list = models.Depart.objects.all()
    print(dp_list)  # <QuerySet [<Depart: Depart object (2)>, <Depart: Depart object (1)>]>
    for item in dp_list:
        print(item.id, item.title)
        """
        2 技術部
        1 運維部
        """
    # 查詢滿足條件的數據行
    # emp_list_id = models.EmpInfo.objects.filter(name='thanlon').first()
    # dp_list_id = models.Depart.objects.filter(id=1)
    # dp_list_id = models.Depart.objects.filter(id__lt=2)
    dp_list_id = models.Depart.objects.filter(id__gt=1)
    for item in dp_list_id:
        print(item.id, item.title)  # 2 技術部
    return render(request, 'index.html')

數據的刪除:

from django.shortcuts import render, HttpResponse, reverse
from app01 import models

# Create your views here.
def index(request):
    # 刪除id=2的部門
    models.Depart.objects.filter(id=2).delete()
    return render(request, 'index.html')
+----+-----------+
| id | title     |
+----+-----------+
|  1 | 運維部    |
+----+-----------+

數據表的修改:

from django.shortcuts import render, HttpResponse, reverse
from app01 import models

# Create your views here.
def index(request):
    # 修改id=1的部門信息
    models.Depart.objects.filter(id=1).update(title="人事部")
    return render(request, 'index.html')
+----+-----------+
| id | title     |
+----+-----------+
|  1 | 人事部    |
+----+-----------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章