2018-11-27 模型基礎(chǔ)

一、模型介紹

?1. 創(chuàng)建一個(gè)簡單的學(xué)生模型

class Student(models.Model):
    # 繼承models.Model
    # 定義數(shù)據(jù)字段
    name = models.CharField(max_length=10, unique=True)
    age = models.IntegerField(default=18)
    gender = models.BooleanField(default=1)
    # 創(chuàng)建數(shù)據(jù)時(shí)間,默認(rèn)為當(dāng)前時(shí)間: auto_now_add=True
    create_time = models.DateTimeField(auto_now_add=True, null=True)
    # auto_now : 修改時(shí)間, 每次修改學(xué)生信息時(shí),修改該字段的時(shí)間為當(dāng)前時(shí)間
    operate_time = models.DateTimeField(auto_now=True, null=True)

    class Meta:
        # 指定Student模型映射到數(shù)據(jù)庫中時(shí),對應(yīng)的表名。
        db_table = 'tb_student'

2. 配置數(shù)據(jù)庫

  • 2.1 在項(xiàng)目文件夾下的setting.py中修改數(shù)據(jù)庫類型和配置數(shù)據(jù)庫連接信息

??如:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dj7',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': 3306
    }
}

  • 2.2 其次需要在項(xiàng)目文件夾下的init.py中添加對應(yīng)的數(shù)據(jù)庫驅(qū)動

mysql如下:

import pymysql (如果沒有pymysql的需要安裝pymysql第三方庫)
pymysql.install_as_MySQLdb()

?3. 注冊應(yīng)用

  • 在項(xiàng)目文件下的setting.py文件中的INSTALLED_APPS最后添加應(yīng)用名

??如:

INSTALLED_APPS = [
    這里省略部分默認(rèn)代碼
    'app'
] 

?4. 生成遷移文件

格式: python manage.py makemigrations

  • 此時(shí)會在項(xiàng)目文件夾下的migration文件夾下創(chuàng)建一個(gè)遷移文件

如:0001_initial.py

?5. 制作遷移

格式: python manage.py migrate

此時(shí)在數(shù)據(jù)庫中就會創(chuàng)建一張與模型向?qū)?yīng)的數(shù)據(jù)庫表(其中自動創(chuàng)建一個(gè)id字段并且自動增長和是主鍵)

二、更改啟動服務(wù)的ip和端口

格式:python manage.py runserver ip:port
或者
格式:python manage.py runserver port

?注意:后面參數(shù)可以是IP:port 或者 port,不能只是ip

三、Debug(程序調(diào)試)

    1. 在自己認(rèn)為可能出現(xiàn)錯(cuò)誤的地方添加斷點(diǎn),再通過Debug對程序進(jìn)行檢查調(diào)試
    1. python中可以通過debug控制臺打印程序運(yùn)行值檢查是否出錯(cuò)

四、通過ORM操作數(shù)據(jù)庫(CRUD操作)

?在上面創(chuàng)建的模型基礎(chǔ)上通過模型去更改操作數(shù)據(jù)庫表

?1. 配置url解析

# 需要先導(dǎo)入app應(yīng)用下的views(視圖)
from app import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 新增數(shù)據(jù)
    # 配置url,并調(diào)用相應(yīng)的視圖函數(shù)
    url(r'add_stu/', views.add_stu),
    # 刪除數(shù)據(jù)
    url(r'del_stu/', views.del_stu),
    # 修改數(shù)據(jù)
    url(r'^up_stu', views.up_stu),
] 

?2. 在應(yīng)用(app)文件夾下views.py文件中定義與url相對應(yīng)的視圖函數(shù)

# 引入Student模型
from app.models import Student

def add_stu(request):
    # 創(chuàng)建向數(shù)據(jù)庫student表中插入數(shù)據(jù)的函數(shù)
    # 添加數(shù)據(jù)
    # 方式一:
    # stu = Student()
    # stu.name = '小明'
    # 向數(shù)據(jù)庫中插入數(shù)據(jù)
    # stu.save()

    # 方式二:
    Student.objects.create(name='大錘11', age=19)
    # 返回響應(yīng)
    return HttpResponse('添加成功!')


def del_stu(request):
    # 實(shí)現(xiàn)刪除數(shù)據(jù)操作
    # 1. 先查詢name=‘大錘’的信息
    Student.objects.filter(name='大錘11').delete()

    return HttpResponse('刪除成功!')


def up_stu(request):
    # 修改student表中的數(shù)據(jù)
    # 方式一:
    # stus = Student.objects.filter(name='小明')
    # 獲取小明對象
    # stu = stus[0]
    # stu.name = '大錘'
    # stu.save()
    # 方式二:
    # stu = Student.objects.filter(name='小明').first()
    # stu.name = '大錘'
    # stu.save()

    # 方式三:
    Student.objects.filter(name='小明').update(name='小明')

    return HttpResponse('修改成功!')

五、模型中定義的數(shù)據(jù)類型和數(shù)據(jù)庫(mysql)中的數(shù)據(jù)類型的關(guān)系

?5.1 定義模型

?? 1. 字段要求

字段名不能使python的保留字,否則會導(dǎo)致語法錯(cuò)誤
字段名不能有多個(gè)連續(xù)下劃線,否則會影響ORM查詢操作

?5.2 模型中的數(shù)據(jù)類型

<center>模型字段類型</center>

字段類 說明
AutoField 自增ID字段
BigIntegerField 64位有符號整數(shù)
BinaryField 存儲二進(jìn)制數(shù)據(jù)的字段,對應(yīng)Python的bytes類型
BooleanField 存儲True或False
CharField 長度較小的字符串
DateField 存儲日期,有auto_now和auto_now_add屬性
DateTimeField 存儲日期和日期,兩個(gè)附加屬性同上
DecimalField 存儲固定精度小數(shù),有max_digits(有效位數(shù))和decimal_places(小數(shù)點(diǎn)后面)兩個(gè)必要的參數(shù)
DurationField 存儲時(shí)間跨度
EmailField 與CharField相同,可以用EmailValidator驗(yàn)證
FileField 文件上傳字段
FloatField 存儲浮點(diǎn)數(shù)
ImageField 其他同F(xiàn)ileFiled,要驗(yàn)證上傳的是不是有效圖像
IntegerField 存儲32位有符號整數(shù)。
GenericIPAddressField 存儲IPv4或IPv6地址
NullBooleanField 存儲True、False或null值
PositiveIntegerField 存儲無符號整數(shù)(只能存儲正數(shù))
SlugField 存儲slug(簡短標(biāo)注)
SmallIntegerField 存儲16位有符號整數(shù)
TextField 存儲數(shù)據(jù)量較大的文本
TimeField 存儲時(shí)間
URLField 存儲URL的CharField
UUIDField 存儲全局唯一標(biāo)識符

?常用的類型主要有以下幾類(自己總結(jié)的)

類型 說明
自增id字段 AutoField
數(shù)字類型 IntegerField、FloatField、DecimalField
字符串類型 CharField、TextField
時(shí)間類型 DateField、DateTimeField、TimeField
文件類型 FielField、ImageField
布爾和空 BooleanField、NullBoolField

<center>模型字段屬性</center>

選項(xiàng) 說明
null 數(shù)據(jù)庫中對應(yīng)的字段是否允許為NULL,默認(rèn)為False
blank 后臺模型管理驗(yàn)證數(shù)據(jù)時(shí),是否允許為NULL,默認(rèn)為False
choices 設(shè)定字段的選項(xiàng),各元組中的第一個(gè)值是設(shè)置在模型上的值,第二值是人類可讀的值
db_column 字段對應(yīng)到數(shù)據(jù)庫表中的列名,未指定時(shí)直接使用字段的名稱
db_index 設(shè)置為True時(shí)將在該字段創(chuàng)建索引
db_tablespace 為有索引的字段設(shè)置使用的表空間,默認(rèn)為DEFAULT_INDEX_TABLESPACE
default 字段的默認(rèn)值
editable 字段在后臺模型管理或ModelForm中是否顯示,默認(rèn)為True
error_messages 設(shè)定字段拋出異常時(shí)的默認(rèn)消息的字典,其中的鍵包括null、blank、invalid、invalid_choice、unique和unique_for_date
help_text 表單小組件旁邊顯示的額外的幫助文本。
primary_key 將字段指定為模型的主鍵,未指定時(shí)會自動添加AutoField用于主鍵,只讀。
unique 設(shè)置為True時(shí),表中字段的值必須是唯一的
verbose_name 字段在后臺模型管理顯示的名稱,未指定時(shí)使用字段的名稱

<center>模型元數(shù)據(jù)選項(xiàng)</center>

選項(xiàng) 說明
abstract 設(shè)置為True時(shí)模型是抽象父類
app_label 如果定義模型的應(yīng)用不在INSTALLED_APPS中可以用該屬性指定
db_table 模型使用的數(shù)據(jù)表名稱
db_tablespace 模型使用的數(shù)據(jù)表空間
default_related_name 關(guān)聯(lián)對象回指這個(gè)模型時(shí)默認(rèn)使用的名稱,默認(rèn)為<model_name>_set
get_latest_by 模型中可排序字段的名稱。
managed 設(shè)置為True時(shí),Django在遷移中創(chuàng)建數(shù)據(jù)表并在執(zhí)行flush管理命令時(shí)把表移除
order_with_respect_to 標(biāo)記對象為可排序的
ordering 對象的默認(rèn)排序
permissions 創(chuàng)建對象時(shí)寫入權(quán)限表的額外權(quán)限
default_permissions 默認(rèn)為('add', 'change', 'delete')
unique_together 設(shè)定組合在一起時(shí)必須獨(dú)一無二的字段名
index_together 設(shè)定一起建立索引的多個(gè)字段名
verbose_name 為對象設(shè)定人類可讀的名稱
verbose_name_plural 設(shè)定對象的復(fù)數(shù)名稱
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容