ORM:object relational mapping,對象關係映射python
django中使用原生sql的弊端:
一、SQL語句重複率很高,利用率不高
二、若是業務邏輯生變,原生SQL更改起來比較多
三、容易忽略一些web安全問題,如SQL注入git
ORM的優勢:
易用性:使用ORM作數據庫的開發能夠有效的減小重複SQL語句的機率,寫出來的模型也更加直觀、清晰。
性能損耗小:ORM轉換成底層數據庫操做指令確實會有一些開銷。但從實際的狀況來看,這種性能損耗不多(不足5%),只要不是對性能有嚴苛的要求,綜合考慮開發效率、代碼的閱讀性,帶來的好處要遠遠大於性能損耗,並且項目越大做用越明顯。
設計靈活:能夠輕鬆的寫出複雜的查詢。
可移植性:Django封裝了底層的數據庫實現,支持多個關係數據庫引擎,包括流行的MySQL、PostgreSQL和SQLite。能夠很是輕鬆的切換數據庫。web
ORM經常使用字段類型:
一、CharField:字符串類型,映射到數據庫中會轉換成varchar類型,使用時必須傳入max_length屬性以定義該字符串的最大長度,若是超過254個字符,就不建議使用CharField了,此時建議使用TextField。sql
二、EmailField:在數據庫底層也是一個varchar類型,默認最大長度是254個字符,固然也能夠本身傳遞max_length參數,這個Field在數據庫層面不會限制必定要傳遞符合email條件的字符串,只是之後在使用ModelForm表單驗證時,會起做用數據庫
三、URLField:相似於CharField,在數據庫底層也是一個varchar類型,只不過只能用來存儲url格式的字符串。而且默認的max_length是200,同EmailFielddjango
四、FloatField:浮點數類型,映射到數據庫中會變成double類型安全
五、IntegerField:整數類型,映射到數據庫中會變成11位的int類型數據結構
六、BigIntegerField:大整形。值的區間是-9223372036854775808——9223372036854775807app
七、PositiveIntegerField:正整形。值的區間是0——2147483647函數
八、SmallIntegerField:小整形。值的區間是-32768——32767
九、PositiveSmallIntegerField:正小整形。值的區間是0——32767
十、BooleanField:布爾類型(True/False),映射到數據庫中會變成長度只有1位的tinyint類型,這個Field不接受null參數,要想使用能夠爲null的布爾類型的字段,就要使用NullBooleanField
十一、AutoField:自增加類型,映射到數據庫中是11位的整數,使用此字段時,必須傳遞primary_key=True,不然在生成遷移腳本文件時,就會報錯,一個模型不能有兩個自增加字段。通常狀況下咱們用不到這個字段,若是不定義主鍵,django會自動的爲咱們生成id字段做爲主鍵
十二、BigAutoField:自增加類型,用法同AutoField。映射到數據庫中會成爲20位的bigint類型
1三、DateTimeField:日期時間類型,在python中對應的是datetime.datetime類型,在映射到數據庫中也是datetime類型。使用這個Field能夠傳遞如下幾個參數:
auto_now=True:在每次這個數據保存的時候,都使用當前的時間。好比做爲一個記錄修改日期的字段
auto_now_add=True:在每條數據第一次被添加進去的時候,都使用當前的時間。好比做爲一個記錄第一次入庫的字段
注意:若是在setting.py中配置了USE_TZ=True,那麼上兩個默認值都來自於django.utils.timezone.now所轉化來的值
在模板中將一個UTC時間轉換成本地時間:
首先模板HTML文件的開頭導入tz:
{% load tz %}
在傳遞過來的時間變量utc_time中使用localtime過濾器:
{{utc_time | localtime}}
其實,django知道咱們的想法,已經爲咱們作好了配置,咱們並不須要配置其餘的東西就能夠直接使用{{utc_time}},此時只要咱們在setting.py文件中設置 USE_TZ=True,TIME_ZONE='Asia/Shanghai',UTC時間變量在渲染到模板上的時候會自動的爲咱們加載成TIME_ZONE中所設置的時區的時間。
1四、DateField:日期類型,用法同DateTimeField,在python中對應的是datetime.date類型,在映射到數據庫中是date類型
1五、TimeField:時間類型,用法同DateTimeField,在python中對應的是datetime.time類型,在映射到數據庫中是time類型
1六、FileField:用來存儲文件的
1七、ImageField:用來存儲圖片文件的
1八、TextField:大量的文本類型
1九、DecimalField: 一個固定精度的十進制數類型,使用時必需要傳遞兩個參數,max_digits數字的最大總長度(不含小數點),decimal_places小數部分的長度
Field的經常使用參數:
一、null:標識是否能夠爲空,默認是爲False。在使用字符串相關的Field(CharField/TextField/URLField/EmailField)的時候,官方推薦儘可能不要使用這個參數,也就是保持默認值False。由於Django在處理字符串相關的Field的時候,即便這個Field的null=False,若是你沒有給這個Field傳遞任何值,那麼Django也會使用一個空的字符串""來做爲默認值存儲進去。所以若是再使用null=True,Django會產生兩種空值的情形(NULL或者空字符串)。若是想要在表單驗證的時候容許這個字符串爲空,那麼建議使用blank=True。若是你的Field是BooleanField,因爲BooleanField不接受null參數,所以你若是想要設置這個字段能夠爲空的bool類型,那麼對應的可空的bool類型字段則爲NullBooleanField。
二、blank:標識這個字段在表單驗證的時候是否能夠爲空,默認是False。這個和null是有區別的,null是一個純數據庫級別的。而blank是表單驗證級別的。
三、db_column:這個字段在數據庫中的名字。若是沒有設置這個參數,那麼將會使用模型中屬性的名字。
四、db_index:標識這個字段是否爲索引字段。
五、default:默認值。能夠爲一個值,或者是一個函數,可是不支持lambda表達式。而且不支持列表/字典/集合等可變的數據結構。在用函數做爲值傳遞給default時,只能傳遞函數名,不須要加括號。
六、primary_key:是否爲主鍵,與AutoField/BigAutoField連用,默認是False。
七、unique:在表中這個字段的值是否惟一,在數據庫中就是惟一約束,通常是設置手機號碼/郵箱等。
八、choices:在一個範圍內選擇出一項,注意這個選項與ForeignKey的區別
做用:一、django admin中顯示下拉框;二、避免連表查詢
TYPE_CHOICES = ( #數據庫只保存內部元祖的第一個值,後面的值保存在內存中
(0, '---'),
(1, '第一類'),
(2, '第二類'),
(3, '第三類'),
)
type = models.IntegerField(default=0,choices=TYPE_CHOICES)
模型中Meta配置:
對於一些模型級別的配置。咱們能夠在模型中定義一個類,叫作Meta。而後在這個類中添加一些類屬性來控制模型的做用。好比咱們想要在數據庫映射的時候使用本身指定的表名,而不是使用模型的名稱。那麼咱們能夠在Meta類中添加一個db_table的屬性。示例代碼以下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,null=True,blank=True)
class Meta:
db_table = 'book_model'
如下將對Meta類中的一些經常使用配置進行解釋。
一、db_table:這個模型映射到數據庫中的表名。若是沒有指定這個參數,那麼在映射的時候將會使用模型所在app的名稱加上模型名的小寫來做爲默認的表名。
二、ordering:設置在提取數據的排序方式,由於能夠按照多個字段以優先關係進行排序,因此須要傳遞一個字段的列表,在咱們提取數據時,能夠根據列表中字段從前到後(優先級從高到低)的方式排序,排序默認爲正序,若是你須要哪一個字段按倒序排列,就能夠在這個字段前面加上"-"。後面章節會講到如何查找數據。好比我想在查找數據的時候根據添加的時間排序,那麼示例代碼以下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date',]