摘要:當(dāng)然還有其他高級(jí)的使用,日后再說完整的用戶名郵箱聯(lián)系地址留言信息用戶留言信息使用之前已經(jīng)定義好了數(shù)據(jù)模型的字段元數(shù)據(jù)方法等。
前言
接續(xù)前文,上一篇文章主要涉及了 Django 項(xiàng)目的基礎(chǔ)配置等,這篇主要涉及數(shù)據(jù)庫(kù)相關(guān)的 ORM ,也就是 Django 中的 Model 的使用,MVT 三層之間的交互
教程基本都是東拼西湊的,防止有些東西表述不準(zhǔn)確,因?yàn)槲抑皩?JavaScript 比較多。但是里邊注入了自己的理解,盡量講清楚。
基礎(chǔ)環(huán)境Pycharm 2018
Django 2.0.3
Python 3.6.4
mxonline start 分支
Django Model 配置代替使用原生的 SQL 語(yǔ)句操作數(shù)據(jù)庫(kù)。
原生 SQL 語(yǔ)句操作數(shù)據(jù)庫(kù)# {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
具體的一些細(xì)節(jié)知識(shí)下面會(huì)進(jìn)行敘述。這里只是展示一下如何配置。
# {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ù)庫(kù)是不是生成了表。
之前有十個(gè)表,分別是:
+----------------------------+ | 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)
對(duì)應(yīng)上面 Model 中的字段,完美~
注意事項(xiàng)ChartField 必須指定 max_length。
ORM 功能介紹稍候會(huì)有完整的 Model 例子。
字段 Field每一個(gè)模型都可以包含有任意數(shù)量的字段,每個(gè)字段都會(huì)對(duì)應(yīng)數(shù)據(jù)表中的一個(gè)字段,我們需要指定字段的屬性。
name = models.CharField(max_length=20, verbose_name=u"用戶名")
上述字段的名稱是 name,類型是 models.CharField。對(duì)應(yīng)到 MySQL 數(shù)據(jù)中是 varchar 類型。varchar 類型的字段都是需要去指定一個(gè)長(zhǎng)度值,對(duì)應(yīng)到 Django 的 ORM 模型上就是 max_length 屬性。
字段參數(shù)下面列舉一下目前筆者在開發(fā)中用到的一些字段:
max_length:指定字段的長(zhǎng)度值,接受一個(gè)數(shù)字,CharField 必須指定最大長(zhǎng)度, TextField 不需要。
verbose_name:字段標(biāo)簽的可讀名稱,接受一個(gè)字符串。如果不指定,Django 會(huì)從字段名稱去推斷默認(rèn)的詳細(xì)名稱,建議每一個(gè)字段都進(jìn)行指定。
default:字段默認(rèn)值。
null:是否可以為 null,接受 True 或者 False。
blank: 是否可以為空,同樣接受 True 或者 False。
primary_key:如果設(shè)置為 Ture,則該字段置為模型主鍵,如果模型中沒有指定主鍵,則 Django 會(huì)自動(dòng)為模型添加一個(gè)主鍵,默認(rèn)為 id。
help_text:為 HTML 表單文本提供單文本標(biāo)簽。
choices:一組字段選項(xiàng),提供這一項(xiàng)的時(shí)候,默認(rèn)對(duì)應(yīng)的表單不見是選擇字段的盒子,而不是標(biāo)準(zhǔn)文本字段。
字段類型CharField:用來定義短到中等長(zhǎng)度的字段字符串,必須指定 max_length 屬性。
TextField:用于大型的任意長(zhǎng)度字符串,不強(qiáng)制要求指定 max_length 屬性,指定的 max_length 僅僅當(dāng)該字段以表單顯示才會(huì)使用,不會(huì)再數(shù)據(jù)庫(kù)級(jí)別進(jìn)行強(qiáng)制執(zhí)行。
IntegerField:用于存儲(chǔ)整形數(shù)據(jù),在用于表單中驗(yàn)證輸入的值需要時(shí)整數(shù)。
FloatField:用于存儲(chǔ)浮點(diǎn)型數(shù)據(jù)
DateField 和 DateTimeField:用于存儲(chǔ)/表示日期和日期/時(shí)間信息(分別是Python.datetime.date和datetime.datetime對(duì)象。這些字段可以另外表明(互斥)參數(shù)auto_now=Ture (在每次保存模型時(shí)將該字段設(shè)置為當(dāng)前日期),auto_now_add(僅設(shè)置模型首次創(chuàng)建時(shí)的日期)和default(設(shè)置默認(rèn)日期,可以被用戶覆蓋)。一般筆者選擇的默認(rèn)日期是 datetime.now。
EmailField:用來存儲(chǔ)和驗(yàn)證電子郵件地址。
FileField:用于上傳文件,需要提供 upload_to 指定上傳到的地方。
ImageField:和上傳文件表現(xiàn)基本相似,會(huì)額外進(jìn)行是否為圖像的驗(yàn)證。
AutoField:是一種 IntegerField 自增的特殊類型,如果模型沒有指定主鍵的話,此類型的主鍵將自動(dòng)添加到模型中。
ForeignKey:外鍵,用于指定與另一個(gè)數(shù)據(jù)庫(kù)模型的一對(duì)多關(guān)系。關(guān)系 “一” 側(cè)是包含密鑰的模型。和 flask 指定外鍵的方式不同。
ManyToManyField:用于指定多對(duì)多關(guān)系,例如,一本書可以有幾種類型,每種類型可以包含幾本書)。在我們的圖書館應(yīng)用程序中,我們將非常類似地使用它們ForeignKeys,但是可以用更復(fù)雜的方式來描述組之間的關(guān)系。這些具有參數(shù)on_delete來定義關(guān)聯(lián)記錄被刪除時(shí)會(huì)發(fā)生什么(例如,值models.SET_NULL將簡(jiǎn)單地設(shè)置為值NULL)。筆者用的不是很多。
元數(shù)據(jù)通過聲明 class Meta 來聲明模型級(jí)別的元數(shù)據(jù)
class UserMessage(models.Model): # Config Field class Meta: ordering = ["id"] verbose_name = u"用戶留言信息" verbose_name_plural = verbose_name
這里最有用的功能是可以指定模型返回?cái)?shù)據(jù)時(shí)候的默認(rèn)的順序,更多的文檔可以查看這里
方法一個(gè)模型也可以有方法,最基本的使用就是定義一個(gè)標(biāo)準(zhǔn)的 Python 類方法: __str__:
class UserMessage(models.Model): # Config Field # Config Meta def __str__(self): return self.message
這樣為每個(gè)對(duì)象返回一個(gè)人類可讀的字符串。當(dāng)然還有其他高級(jí)的使用,日后再說
完整的 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)在要做的是把頁(yè)面上提交過來的數(shù)據(jù)通過 ORM 來存放到數(shù)據(jù)庫(kù)中,通過 ORM 來進(jìn)行數(shù)據(jù)的 CURD 操作。
創(chuàng)建數(shù)據(jù)在 templates 中已經(jīng)創(chuàng)建了 message_form.html 模板文件,現(xiàn)在進(jìn)行修改,修改 form 的 action 目標(biāo)地址:
在上一篇文章中,提到過,path 接收 name 參數(shù)。在 template 中可以通過 name 來取到對(duì)應(yīng)的 url,方法如下:
action="{% url "go_form" %}"
這樣做提供了另一種獲取 url 的方式,當(dāng)我們因?yàn)槟撤N原因去修改了 url 地址之后,通過 name 還能找到它。
在 textarea 中,有這樣一段代碼:
{{ my_message.message }}
作用是取到傳入的 my_message 對(duì)象的 message 屬性取出來并顯示,由于 html 基本屬于前端部分了,所以用前端的方式進(jìn)行描述。
雙花括號(hào)(八字胡)語(yǔ)法: {{...}} 在任何模板語(yǔ)言中都很常見,作用是將數(shù)據(jù)渲染到雙括號(hào)內(nèi)部。
上面還有一部分代碼是這樣子的:
{% if my_message.name == "test" %}test{% endif %}"
意思很好懂的,是吧。
具體的 Django 中模板的語(yǔ)法可以查看官方文檔。
后記這里只是簡(jiǎn)單的介紹了一下 Django 中 Model 層、View 層、以及 Template 層之間交互的部分知識(shí),很簡(jiǎn)略,不詳細(xì)。在每部分的后邊都附加了詳細(xì)的官方文檔地址。如果以后有時(shí)間了可以對(duì)每部分進(jìn)行詳細(xì)的闡述。
參考資料Python升級(jí)3.6 強(qiáng)力Django+殺手級(jí)Xadmin打造在線教育平臺(tái)
MDN 的 Django教程 ———— 設(shè)計(jì)LocalLibrary模型
Django 官方文檔 Model 部分
Django Girls 教程
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41442.html
摘要:將業(yè)務(wù)邏輯,數(shù)據(jù)和界面顯示分開,功能劃分清晰,有利于降低軟件的耦合度和團(tuán)隊(duì)開發(fā)。主要的作用就是將一個(gè)請(qǐng)求分發(fā)到不同的處理,再調(diào)用相應(yīng)的和關(guān)于的安裝及使用將在下一章共同學(xué)習(xí)。 Django 簡(jiǎn)單介紹django和mvc,mvt設(shè)計(jì)模式,如果已知悉可以直接跳過。 什么是Django 是由python寫的一個(gè)開源的web應(yīng)用程序框架,于2005年7月初次發(fā)布,并在2008年9月發(fā)布了第一個(gè)正...
摘要:聲明本渣渣部分代碼參考自其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個(gè)開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...
摘要:聲明本渣渣部分代碼參考自其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都有一個(gè)開源的精神,碼出來的代碼本身是希望更多的人用到,應(yīng)用到生產(chǎn)中。 聲明:本渣渣部分代碼參考自TendCode其實(shí)有很多代碼是不需要自己一行行碼出來,生產(chǎn)力是第一位。只有研究型人才需要生產(chǎn)代碼,作為一名渣渣拿來用是最高效的做法。程序員都...
閱讀 3570·2021-11-12 10:36
閱讀 2970·2021-09-22 15:35
閱讀 2889·2021-09-04 16:41
閱讀 1248·2019-08-30 15:55
閱讀 3651·2019-08-29 18:43
閱讀 2138·2019-08-23 18:24
閱讀 1481·2019-08-23 18:10
閱讀 1979·2019-08-23 11:31