摘要:當(dāng)然還有其他高級的使用,日后再說完整的用戶名郵箱聯(lián)系地址留言信息用戶留言信息使用之前已經(jīng)定義好了數(shù)據(jù)模型的字段元數(shù)據(jù)方法等。
前言
接續(xù)前文,上一篇文章主要涉及了 Django 項目的基礎(chǔ)配置等,這篇主要涉及數(shù)據(jù)庫相關(guān)的 ORM ,也就是 Django 中的 Model 的使用,MVT 三層之間的交互
教程基本都是東拼西湊的,防止有些東西表述不準確,因為我之前寫 JavaScript 比較多。但是里邊注入了自己的理解,盡量講清楚。
基礎(chǔ)環(huán)境Pycharm 2018
Django 2.0.3
Python 3.6.4
mxonline start 分支
Django Model 配置代替使用原生的 SQL 語句操作數(shù)據(jù)庫。
原生 SQL 語句操作數(shù)據(jù)庫# {BASE_DIR}/apps/message/models.py import MySQLdb def book_list(request): db = MySQLdb.connect(user="me", db="mydb", password="secret", host="localhost") cursor = db.cursor() cursor.execute("SELECT name FORM books ORDER BY name") names = [row[0] for row in cursor.fetchall()] db.close()配置 Django Model
具體的一些細節(jié)知識下面會進行敘述。這里只是展示一下如何配置。
# {BASE_DIR}/apps/message/models.py # 從 Django 中引入 models from django.db import models # Create your models here. class UserMessage(models.Model): name = models.CharField(max_length=20, verbose_name=u"用戶名") email = models.EmailField(verbose_name=u"郵箱") address = models.CharField(max_length=100, verbose_name=u"聯(lián)系地址") message = models.CharField(max_length=500, verbose_name=u"留言信息") class Meta: verbose_name = u"用戶留言信息" verbose_name_plural = verbose_name
model 創(chuàng)建完成,接下來是生成數(shù)據(jù)表。
生成數(shù)據(jù)表$ python manage.py makemigrations message $ python manage.py migrate message
然后查看數(shù)據(jù)庫是不是生成了表。
之前有十個表,分別是:
+----------------------------+ | Tables_in_test_django | +----------------------------+ | 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)
現(xiàn)在:
+----------------------------+ | Tables_in_test_django | +----------------------------+ | 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 | | message_usermessage | +----------------------------+ 11 rows in set (0.00 sec)
mysql> desc message_usermessage; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | email | varchar(254) | NO | | NULL | | | address | varchar(100) | NO | | NULL | | | message | varchar(500) | NO | | NULL | | +---------+--------------+------+-----+---------+----------------+ 5 rows in set (0.04 sec)
對應(yīng)上面 Model 中的字段,完美~
注意事項ChartField 必須指定 max_length。
ORM 功能介紹稍候會有完整的 Model 例子。
字段 Field每一個模型都可以包含有任意數(shù)量的字段,每個字段都會對應(yīng)數(shù)據(jù)表中的一個字段,我們需要指定字段的屬性。
name = models.CharField(max_length=20, verbose_name=u"用戶名")
上述字段的名稱是 name,類型是 models.CharField。對應(yīng)到 MySQL 數(shù)據(jù)中是 varchar 類型。varchar 類型的字段都是需要去指定一個長度值,對應(yīng)到 Django 的 ORM 模型上就是 max_length 屬性。
字段參數(shù)下面列舉一下目前筆者在開發(fā)中用到的一些字段:
max_length:指定字段的長度值,接受一個數(shù)字,CharField 必須指定最大長度, TextField 不需要。
verbose_name:字段標簽的可讀名稱,接受一個字符串。如果不指定,Django 會從字段名稱去推斷默認的詳細名稱,建議每一個字段都進行指定。
default:字段默認值。
null:是否可以為 null,接受 True 或者 False。
blank: 是否可以為空,同樣接受 True 或者 False。
primary_key:如果設(shè)置為 Ture,則該字段置為模型主鍵,如果模型中沒有指定主鍵,則 Django 會自動為模型添加一個主鍵,默認為 id。
help_text:為 HTML 表單文本提供單文本標簽。
choices:一組字段選項,提供這一項的時候,默認對應(yīng)的表單不見是選擇字段的盒子,而不是標準文本字段。
字段類型CharField:用來定義短到中等長度的字段字符串,必須指定 max_length 屬性。
TextField:用于大型的任意長度字符串,不強制要求指定 max_length 屬性,指定的 max_length 僅僅當(dāng)該字段以表單顯示才會使用,不會再數(shù)據(jù)庫級別進行強制執(zhí)行。
IntegerField:用于存儲整形數(shù)據(jù),在用于表單中驗證輸入的值需要時整數(shù)。
FloatField:用于存儲浮點型數(shù)據(jù)
DateField 和 DateTimeField:用于存儲/表示日期和日期/時間信息(分別是Python.datetime.date和datetime.datetime對象。這些字段可以另外表明(互斥)參數(shù)auto_now=Ture (在每次保存模型時將該字段設(shè)置為當(dāng)前日期),auto_now_add(僅設(shè)置模型首次創(chuàng)建時的日期)和default(設(shè)置默認日期,可以被用戶覆蓋)。一般筆者選擇的默認日期是 datetime.now。
EmailField:用來存儲和驗證電子郵件地址。
FileField:用于上傳文件,需要提供 upload_to 指定上傳到的地方。
ImageField:和上傳文件表現(xiàn)基本相似,會額外進行是否為圖像的驗證。
AutoField:是一種 IntegerField 自增的特殊類型,如果模型沒有指定主鍵的話,此類型的主鍵將自動添加到模型中。
ForeignKey:外鍵,用于指定與另一個數(shù)據(jù)庫模型的一對多關(guān)系。關(guān)系 “一” 側(cè)是包含密鑰的模型。和 flask 指定外鍵的方式不同。
ManyToManyField:用于指定多對多關(guān)系,例如,一本書可以有幾種類型,每種類型可以包含幾本書)。在我們的圖書館應(yīng)用程序中,我們將非常類似地使用它們ForeignKeys,但是可以用更復(fù)雜的方式來描述組之間的關(guān)系。這些具有參數(shù)on_delete來定義關(guān)聯(lián)記錄被刪除時會發(fā)生什么(例如,值models.SET_NULL將簡單地設(shè)置為值NULL)。筆者用的不是很多。
元數(shù)據(jù)通過聲明 class Meta 來聲明模型級別的元數(shù)據(jù)
class UserMessage(models.Model): # Config Field class Meta: ordering = ["id"] verbose_name = u"用戶留言信息" verbose_name_plural = verbose_name
這里最有用的功能是可以指定模型返回數(shù)據(jù)時候的默認的順序,更多的文檔可以查看這里
方法一個模型也可以有方法,最基本的使用就是定義一個標準的 Python 類方法: __str__:
class UserMessage(models.Model): # Config Field # Config Meta def __str__(self): return self.message
這樣為每個對象返回一個人類可讀的字符串。當(dāng)然還有其他高級的使用,日后再說
完整的 model# {BASE_DIR/apps/message/models.py} from django.db import models # Create your models here. class UserMessage(models.Model): name = models.CharField(max_length=20, verbose_name=u"用戶名") email = models.EmailField(verbose_name=u"郵箱") address = models.CharField(max_length=100, verbose_name=u"聯(lián)系地址") message = models.CharField(max_length=500, verbose_name=u"留言信息") class Meta: ordering = ["id"] verbose_name = u"用戶留言信息" verbose_name_plural = verbose_name def __str__(self): return self.message使用 Django ORM
之前已經(jīng)定義好了數(shù)據(jù)模型的字段(Field)、元數(shù)據(jù)(Meta)、方法(Method)等。現(xiàn)在要做的是把頁面上提交過來的數(shù)據(jù)通過 ORM 來存放到數(shù)據(jù)庫中,通過 ORM 來進行數(shù)據(jù)的 CURD 操作。
創(chuàng)建數(shù)據(jù)在 templates 中已經(jīng)創(chuàng)建了 message_form.html 模板文件,現(xiàn)在進行修改,修改 form 的 action 目標地址:
這里根據(jù)自己配置的 Url 來自行決定,由于筆者配置的是 /,所以這里就配置成這個樣子。
這里指定的是使用 form 的原生事件 post 事件進行提交,但是在實際的開發(fā)中,為了實現(xiàn)更精確的控制,我們常常不會使用原生事件,而更傾向于使用 ajax 進行提交,當(dāng)然這里的重點不是前端的邏輯,重點在于 Django 后端邏輯的處理,顧不贅述。
接下來的任務(wù)就是:拿到 POST 發(fā)來的數(shù)據(jù),然后存入數(shù)據(jù)庫中。
存儲數(shù)據(jù)之前使用 Django 的 ORM 進行了數(shù)據(jù)庫中數(shù)據(jù)表的配置,現(xiàn)在使用 Django 的 ORM 將數(shù)據(jù)保存到數(shù)據(jù)庫中。
在 Django 中,我們使用不是傳統(tǒng)的 MVC 架構(gòu),我們使用的是一種叫 MVT 的方式。不同的 Template(模板) 呈現(xiàn)不同的 View。我們將在 View(請求視層)中獲取用戶提交的數(shù)據(jù),以及將從 Model(數(shù)據(jù)層) 中獲得的數(shù)據(jù)傳遞給 Template(模板層)。
MVT 的概念本身就來自于 Django 框架,下面進行代碼的展示:
# {BASE_DIR/apps/message/views.py} from django.shortcuts import render # 引入 render 方法 from .models import UserMessage # 引入之前配置好的 Model # Create your views here. def get_form(request): if request.method == "POST": name = request.POST.get("name", "") message = request.POST.get("name", "") address = request.POST.get("address", "") email = request.POST.get("email", "") user_message = UserMessage() user_message.name = name user_message.message = message user_message.address = address user_message.email = email user_message.save() return render(request, "message_form.html")
通過 POST 方法提交的數(shù)據(jù)會存儲到 request 對象的 POST 屬性下邊,通過 Django 提供的 get 方法就可以取到對應(yīng)的字段。其中 get 接收兩個參數(shù),分別是字段的名稱和默認值。
在取到 Template 提交過來的每一個字段之后,就可以使用 ORM 提供的方法將其存入數(shù)據(jù)庫中。
實例化引入的 Model,然后將之前定義的字段進行賦值,然后就可以調(diào)用實例的 save() 方法將數(shù)據(jù)存入數(shù)據(jù)庫。
然后就可以通過 Navicat 或者終端等方式查看數(shù)據(jù)是否保存到了數(shù)據(jù)庫中。
讀取數(shù)據(jù)之前已經(jīng)實現(xiàn)了數(shù)據(jù)的存儲,這部分將實現(xiàn)數(shù)據(jù)的讀取功能。
# {BASE_DIR/apps/message/views.py} from django.shortcuts import render from .models import UserMessage # Create your views here. def get_form(request): message = None all_message = UserMessage.objects.filter(name="test") if all_message: message = all_message[0] return render(request, "message_form.html", {"my_message": message})
這里會涉及到 Django 的 QuerySets(查詢集)相關(guān)知識,這里撿著用的著的部分看一下。
首先先聲明 message,值為 None,用于存儲取到的數(shù)據(jù)。
從本質(zhì)上講,QuerySets 是給定對象模型(這里是 UserModel)的對象列表(list),允許我們從數(shù)據(jù)庫中讀取數(shù)據(jù),選擇以及排序。通過這種方式操作的話,就可以避免直接操作數(shù)據(jù)庫。從而抹平不同數(shù)據(jù)庫操作的差異,這部分由 Django 幫我們來完成。
上面的代碼中有這樣的一句:
UserMessage.objects.filter(name="test")
作用是從數(shù)據(jù)庫中查找 name 值為 test 的所有條目,返回的是一個
然后如果 all_message 不為空的話,取出列表第一項,然后傳遞給 my_message 模板。
關(guān)于 QuerySet 的詳細知識,可以查看 Django 的官方文檔的這一部分
渲染到模板在上面步驟中,我們將符合預(yù)設(shè)條件的數(shù)據(jù)從數(shù)據(jù)庫中取出來,傳遞到模板中,這里的目標是將數(shù)據(jù)正確的顯示與渲染。部分語法類似于 ejs 模板的語法,但同時 Django 又在模板中內(nèi)置了很多常用的函數(shù)。但是 Django 不像 Java 那樣,允許在模板中寫一些 Java 代碼,Django 的 Template 中不允許將 Python 代碼混進來。
由于模板代碼過長,這里只放一些關(guān)鍵部分的代碼,完整的代碼可以查看文章對應(yīng)的代碼倉庫。
在上一篇文章中,提到過,path 接收 name 參數(shù)。在 template 中可以通過 name 來取到對應(yīng)的 url,方法如下:
action="{% url "go_form" %}"
這樣做提供了另一種獲取 url 的方式,當(dāng)我們因為某種原因去修改了 url 地址之后,通過 name 還能找到它。
在 textarea 中,有這樣一段代碼:
{{ my_message.message }}
作用是取到傳入的 my_message 對象的 message 屬性取出來并顯示,由于 html 基本屬于前端部分了,所以用前端的方式進行描述。
雙花括號(八字胡)語法: {{...}} 在任何模板語言中都很常見,作用是將數(shù)據(jù)渲染到雙括號內(nèi)部。
上面還有一部分代碼是這樣子的:
{% if my_message.name == "test" %}test{% endif %}"
意思很好懂的,是吧。
具體的 Django 中模板的語法可以查看官方文檔。
后記這里只是簡單的介紹了一下 Django 中 Model 層、View 層、以及 Template 層之間交互的部分知識,很簡略,不詳細。在每部分的后邊都附加了詳細的官方文檔地址。如果以后有時間了可以對每部分進行詳細的闡述。
參考資料Python升級3.6 強力Django+殺手級Xadmin打造在線教育平臺
MDN 的 Django教程 ———— 設(shè)計LocalLibrary模型
Django 官方文檔 Model 部分
Django Girls 教程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41442.html
摘要:將業(yè)務(wù)邏輯,數(shù)據(jù)和界面顯示分開,功能劃分清晰,有利于降低軟件的耦合度和團隊開發(fā)。主要的作用就是將一個請求分發(fā)到不同的處理,再調(diào)用相應(yīng)的和關(guān)于的安裝及使用將在下一章共同學(xué)習(xí)。 Django 簡單介紹django和mvc,mvt設(shè)計模式,如果已知悉可以直接跳過。 什么是Django 是由python寫的一個開源的web應(yīng)用程序框架,于2005年7月初次發(fā)布,并在2008年9月發(fā)布了第一個正...
摘要:聲明本渣渣部分代碼參考自其實有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...
摘要:聲明本渣渣部分代碼參考自其實有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...
閱讀 3486·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2807·2021-09-04 16:41
閱讀 1164·2019-08-30 15:55
閱讀 3574·2019-08-29 18:43
閱讀 2070·2019-08-23 18:24
閱讀 1412·2019-08-23 18:10
閱讀 1921·2019-08-23 11:31