django模型層(model)進(jìn)行建表、查詢與刪除的基礎(chǔ)教程
前言
在django的框架設(shè)計中采用了mtv模型,即Model,template,viewer
Model相對于傳統(tǒng)的三層或者mvc框架來說就相當(dāng)對數(shù)據(jù)處理層,它主要負(fù)責(zé)與數(shù)據(jù)的交互,在使用django框架設(shè)計應(yīng)用系統(tǒng)時,需要注意的是django默認(rèn)采用的是orm框架中的codefirst模型,也就是說開發(fā)人員只需要專注于代碼的編寫,而不需要過多的關(guān)注數(shù)據(jù)庫層面的東西,把開發(fā)人員從數(shù)據(jù)庫中解放出來
django會根據(jù)Model類生成一個數(shù)據(jù)庫鏡像文件,然后再使用該鏡像文件生成數(shù)據(jù)庫,同時該文件將記錄與數(shù)據(jù)庫同步版本的變化,所以在使用django進(jìn)行開發(fā)時不要手工去修改數(shù)據(jù)庫,這樣會造成django框架的版本記錄不正確,從而無法正確的同步數(shù)據(jù)模型與數(shù)據(jù)庫的內(nèi)容
django生成的鏡像文件內(nèi)容如下:
from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('web', '0001_initial'), ] operations = [ migrations.AddField( model_name='userinfo', name='sex', field=models.BooleanField(default=True), preserve_default=False, ), ]
以上內(nèi)容為生的一一個版本的鏡像,內(nèi)容記錄了對model所在的app的記錄,以及執(zhí)行的動作,如上面的鏡像文件記錄為對web的app中的model增加了一個名稱為sex的字段,字段類型為Boolean,默認(rèn)為True。
要說一個項(xiàng)目最重要的部分是什么那鐵定數(shù)據(jù)了,也就是數(shù)據(jù)庫,所以下面這篇就帶大家走進(jìn)django關(guān)于模型層model的使用,model主要就是操縱數(shù)據(jù)庫不使用sql語句的情況下完成數(shù)據(jù)庫的增刪改查。
本篇僅帶領(lǐng)大家進(jìn)行簡單的建表、查詢和刪除,下面話不多說了,來一起看看詳細(xì)的介紹吧。
一、ORM
映射關(guān)系:
表名 <-------> 類名
字段 <-------> 屬性
表記錄 <------->類實(shí)例對象
二、創(chuàng)建表(建立模型)
1、創(chuàng)建表的代碼寫在項(xiàng)目下的models文件中
1)比如我們創(chuàng)建一個圖書表,建立如下:
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) #AutoField有序整形 IntegerField整形 title = models.CharField(max_length=32) #CharField字符 author = models.CharField(max_length=32) publishDate = models.DateField() #DateField日期類型 price = models.DecimalField(max_digits=5, decimal_places=2) #DecimalField浮點(diǎn)型也可以用FloatField
類名就是表名,屬性就是字段。繼承django提供給我們的用于做轉(zhuǎn)換的models.Model
才能將我們寫的類轉(zhuǎn)化為數(shù)據(jù)庫
定義好模型之后,你需要告訴Django 使用這些模型。你要做的就是修改配置文件。
2)字段常用參數(shù)
(1)null
如果為True,Django 將用NULL 來在數(shù)據(jù)庫中存儲空值。 默認(rèn)值是 False.
(1)blank
如果為True,該字段允許不填。默認(rèn)為False。
要注意,這與 null 不同。null純粹是數(shù)據(jù)庫范疇的,而 blank 是數(shù)據(jù)驗(yàn)證范疇的。
如果一個字段的blank=True
,表單的驗(yàn)證將允許該字段是空值。如果字段的blank=False
,該字段就是必填的。
(2)default
字段的默認(rèn)值??梢允且粋€值或者可調(diào)用對象。如果可調(diào)用 ,每有新對象被創(chuàng)建它都會被調(diào)用。
(3)primary_key
如果為True,那么這個字段就是模型的主鍵。如果你沒有指定任何一個字段的primary_key=True
,
Django 就會自動添加一個IntegerField字段做為主鍵,所以除非你想覆蓋默認(rèn)的主鍵行為,
否則沒必要設(shè)置任何一個字段的primary_key=True
。
(4)unique
如果該值設(shè)置為 True, 這個數(shù)據(jù)字段的值在整張表中必須是唯一的
(5)choices
由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項(xiàng)。 如果設(shè)置了choices ,默認(rèn)的表單將是一個選擇框而不是標(biāo)準(zhǔn)的文本框,而且這個選擇框的選項(xiàng)就是choices 中的選項(xiàng)。
這是一個關(guān)于 choices 列表的例子:
YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate'), )
每個元組中的第一個元素,是存儲在數(shù)據(jù)庫中的值;第二個元素是在管理界面或 ModelChoiceField 中用作顯示的內(nèi)容。 在一個給定的 model 類的實(shí)例中,想得到某個 choices 字段的顯示值,就調(diào)用 get_FOO_display 方法(這里的 FOO 就是 choices 字段的名稱 )。
例如:
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) >>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
2、修改配置文件setting
1)django默認(rèn)使用的是sqlite3數(shù)據(jù)庫,我們使用的是mysql數(shù)據(jù)庫所以需要修改配置
原先配置(將這些配置注釋掉)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
重新配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', #你的數(shù)據(jù)庫名稱 數(shù)據(jù)庫需要自己提前建好 'USER': 'root', #你的數(shù)據(jù)庫用戶名 'PASSWORD': '', #你的數(shù)據(jù)庫密碼 'HOST': '', #你的數(shù)據(jù)庫主機(jī),留空默認(rèn)為localhost 'PORT': '3306', #你的數(shù)據(jù)庫端口 } }
3、創(chuàng)建表命令
1)同步更改數(shù)據(jù)庫表或字段
老版本:
python manage.py syncdb
Django 1.7.1 及以上的版本需要用以下命令
python manage.py makemigrations python manage.py migrate
2)運(yùn)行python manage.py makemigrations
后我們應(yīng)用下的migrations文件夾里會自動生成一個文件,是將我們寫的類進(jìn)一步轉(zhuǎn)化:
# -*- coding: utf-8 -*- # Generated by Django 1.11.6 on 2017-10-25 03:30 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Book', fields=[ ('nid', models.AutoField(primary_key=True, serialize=False)), ('title', models.CharField(max_length=32)), ('author', models.CharField(max_length=32)), ('publishDate', models.DateField()), ('price', models.DecimalField(decimal_places=2, max_digits=5)), ], ), ]
3)運(yùn)行python manage.py migrate
后表就插入到我們的數(shù)據(jù)庫中了
4)注意:
如果我們的python是3.x版本運(yùn)行上面兩條會報錯
No module named "MySQLdb"
在3.x走數(shù)據(jù)庫用的是pymysql模塊所以我們需要告訴django用pymysql
在應(yīng)用下的__init__.py文件里添加代碼
import pymysql pymysql.install_as_MySQLdb()
運(yùn)行后在數(shù)據(jù)庫里查看:
會發(fā)現(xiàn)django給我們創(chuàng)建了很多表 我們自己創(chuàng)建的Book表會被自動改名為 應(yīng)用名_book 這樣避免了我們在不同的應(yīng)用中有相同的表,其他的表后面用到時會一一介紹。
三、查看表
1、先在視圖函數(shù)view中將數(shù)據(jù)取出來
from app01 import models #app01是應(yīng)用名 def index(request): # 從數(shù)據(jù)庫取出所有書籍對象 bookList=models.Book.objects.all() # [bookObj1,.....] return render(request,"index.html",{"bookList":bookList})
查詢相關(guān)
<1> all(): 查詢所有結(jié)果
<2> filter(): 查詢所給篩選條件相匹配的對象
2、在template模版中接收
{% for book_obj in bookList %} <tr> <td>{{ book_obj.nid }}</td> <td>{{ book_obj.title }}</td> <td>{{ book_obj.author }}</td> <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td> <td>{{ book_obj.price }}</td> </tr> {% endfor %}
四、刪除
刪除方法就是 delete()
。它運(yùn)行時立即刪除對象而不返回任何值。
比如我們給表中添加一個刪除按鈕來實(shí)現(xiàn)點(diǎn)擊按鈕后數(shù)據(jù)庫每條記錄的刪除
1、template模版
{% for book_obj in bookList %} <tr> <td>{{ book_obj.nid }}</td> <td>{{ book_obj.title }}</td> <td>{{ book_obj.author }}</td> <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td> <td>{{ book_obj.price }}</td> <td> <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">刪除</button></a> </td> </tr> {% endfor %}
2、url 分發(fā)
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^del/(\d+)', views.delBook), ]
3、視圖函數(shù)view實(shí)現(xiàn)刪除
def delBook(request,id): models.Book.objects.filter(nid=id).delete() return redirect("/index/")
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
tensorflow從ckpt和從.pb文件讀取變量的值方式
這篇文章主要介紹了tensorflow從ckpt和從.pb文件讀取變量的值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05linux下python使用sendmail發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了linux下python使用sendmail發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05使用Python快樂學(xué)數(shù)學(xué)Github萬星神器Manim簡介
這篇文章主要介紹了使用Python快樂學(xué)數(shù)學(xué)Github萬星神器Manim簡介,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Pytorch的torch.utils.data中Dataset以及DataLoader示例詳解
torch.utils.data?是?PyTorch?提供的一個模塊,用于處理和加載數(shù)據(jù),該模塊提供了一系列工具類和函數(shù),用于創(chuàng)建、操作和批量加載數(shù)據(jù)集,這篇文章主要介紹了Pytorch的torch.utils.data中Dataset以及DataLoader等詳解,需要的朋友可以參考下2023-08-08