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