【django系列學習筆記】Django 模型(M)- (1)模型的定義

Django也遵循了MVC的分層原則,不過在作法上略有不一樣。
    首先模型部分保持不變:Django的模型增只負責把數據傳入傳出數據庫。然而Django裏的視圖卻並非顯示數據的最後一步----Django的視圖其實更接近MVC裏傳統意義上的控制器。他們是用來將模型層和表示層(有HTML和Django的模板語言組成)連接在一塊兒的python函數。
按Django開發團隊的話老說就是: 咱們理解的MVC裏,視圖的做用是描述將要顯示給用戶的數據。這不只僅是數據看上去的外觀,含包括如何表示數據。視圖描述的是你能看那些數據,而不是怎麼看到它。
    換一種說法,Django把表示層一分爲二,視圖方法定義了要顯示模型裏的什麼數據,而模板則定義了最終信息的顯示方式。
而框架本身則擔當了控制器的角色--它提供了決定什麼視圖和什麼模板一塊兒響應給定請求的機制。
python

1、模型的定義

一、基礎

    |-每一個模型都是django.db.models.Model 的一個Python 子類。
    |-模型的每一個屬性都表示數據庫中的一個字段。
    |-Django 提供一套自動生成的用於數據庫訪問的API;
    |-模型表名爲 myapp_modelname
mysql

二、字段

django常見Field Types:
    一、AutoField
    若是沒有指明主鍵,就會產生一個自增的主鍵。
    二、BigIntegerField
    64位的整型數值,從 -2^63 (-9223372036854775808) 到 2^63-1(9223372036854775807)。
    三、BinaryField
    存儲原始二進制數據,僅支持字節分配。功能有限。
    四、BooleanField
    布爾型和NullBooleanField有區別,true/false,本類型不容許出現null。
    五、CharField
    字符串,通常都在建立時寫入max_length參數。
    六、CommaSeparatedIntegerField
    逗號分隔的整數,考慮到數據庫的移植性,max_length參數應該必選。
    原文解釋:A field of integers separated by commas. As in CharField, the max_length argument is required and the note about database portability mentioned there should be heeded.
    七、DateField
    時間,對應Python的datetime.date,額外的參數:DateField.auto_now表示是否每次修改時改變時間,DateField.auto_now_add 表示是否建立時表示時間,通常來講數據庫重要的表都要有這樣的字段記錄建立字段時間個最後一次改變的時間。關於時間的話,建議timestamp,固然 python的話仍是DateTime吧。
    八、DateTimeField
    對應Python的datetime.datetime,參照參數(7)。
    九、DecimalField
    固定精度的十進制數,通常用來存金額相關的數據。對應python的Decimal,額外的參數包括DecimalField.max_digits和DecimalField.decimal_places ,這個仍是要參照一下mysql的Decimal類型,
http://database.51cto.com/art/201005/201651.htm
    例如:price = models.DecimalField(max_digits=8,decimal_places=2)
    十、EmailField
    字符串,會檢查是不是合法的email地址
    十一、FileField
    class FileField([upload_to=None, max_length=100, **options])
    存文件的,參數upload_to在1.7以前的一些老版本中必選的
    十二、FloatField
    浮點數,必填參數:max_digits,數字長度;decimal_places,有效位數。
    1三、ImageField
    class ImageField([upload_to=None, height_field=None, width_field=None, max_length=100, **options])
    圖片文件類型,繼承了FileField的全部屬性和方法。參數除upload_to外,還有height_field,width_field等屬性。
    1四、IntegerField
    [-2147483648,2147483647 ]的取值範圍對Django所支持的數據庫都是安全的。
    1五、IPAddressField
    點分十進制表示的IP地址,如10.0.0.1
    1六、GenericIPAddressField
    ip v4和ip v6地址表示,ipv6遵循RFC 4291section 2.2,
    1七、NullBooleanField
    能夠包含空值的布爾類型,至關於設置了null=True的BooleanField。
    1八、PositiveIntegerField
    正整數或0類型,取值範圍爲[0 ,2147483647]
    1九、PositiveSmallIntegerField
    正短整數或0類型,相似於PositiveIntegerField,取值範圍依賴於數據庫特性,[0 ,32767]的取值範圍對Django所支持的數據庫都是安全的。
    20、SlugField
    只能包含字母,數字,下劃線和連字符的字符串,一般被用於URLs表示。可選參數max_length=50,prepopulate_from用於指示在admin表單中的可選值。db_index,默認爲True。
    2一、SmallIntegerField
    小整數字段,相似於IntegerField,取值範圍依賴於數據庫特性,[-32768 ,32767]的取值範圍對Django所支持的數據庫都是安全的。
    2二、TextField
    文本類型
    2三、TimeField
    時間,對應Python的datetime.time
    2四、URLField
    存儲URL的字符串,默認長度200;verify_exists(True),檢查URL可用性。
    2五、FilePathField
    class FilePathField(path=None[, match=None, recursive=False, max_length=100, **options])
    相似於CharField,可是取值被限制爲指定路徑內的文件名,path參數是必選的。
    詳見官方文檔:
   
https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types
   
    經常使用字段屬性
    null
    若是設置爲 True , Django 存放一個 NULL 到數據庫字段。默認爲 False。
    blank
    若是設置爲 True , 此 field 容許爲 blank (空白),默認爲 False。
    要注意,這與 null 不一樣。null純粹是數據庫範疇的,而 blank 是數據驗證範疇的。若是一個字段的blank=True,表單的驗證將容許該字段是空值。若是字段的blank=False,該字段就是必填的。
    choices
    一個2元元組的元組或者列表,若是執行 choices , Django 的 admin 就會使用 選擇框而不是標準的 text 框填寫這個 field。
    default
    field 的默認值,可使用可調用對象(a callable object),若是使用可調用 對象,那麼每次建立此 model 的新對象時調用可調用對象。常見如 datatime 。
    help_text
    help_text 的值能夠在 admin form 裏顯示,不過即便不使用 admin ,也能夠當 作描述文檔使用。
    primary_key
    若是爲 True , 這個 field 就是此 model 的 primary key 。
    unique
    若是爲 True, 此 field 在這個 table 裏必須惟一。
    verbose_name
    ForeignKey、ManyToManyField 和 OneToOneField 使用此來定義「自述名」。
   
git


三、關係

    多對一 : ForeignKey
    多對多 :ManyToManyField 能夠自定義中介模型,源模型的ManyToManyField 字段將使用through 參數指向中介模型
    一對一 :OneToOneField
算法

 

四、模型繼承

|-抽象基類:一般,你只想使用父類來持有一些信息,你不想在每一個子模型中都敲一遍。這個類永遠不會單獨使用,因此你使用抽象基類。沒法生成數據表單或者管理器,而且不能實例化或者儲存。
    |-多表繼承:若是你繼承一個已經存在的模型且想讓每一個模型具備它本身的數據庫表,那麼應該使用多表繼承。Django 會自動建立一個 OneToOneField字段將子類連接至非抽象的父 model 。若是你想指定連接父類的屬性名稱,你能夠建立你本身的 OneToOneField字段並設置 parent_link=True ,從而使用該字段連接父類。
    |-代理模型:最後,若是你只是想改變模塊Python 級別的行爲,而不用修改模型的字段,你可使用代理模型。
    |-多重繼承:若是多個父類含有 Meta類,只有第一個會被使用,剩下的會忽略掉(Django 1.7以前,繼承多個含有id主鍵字段的模型不會拋出異常,可是會致使數據丟失。)。
    抽象基類:
sql

    from django.db import models
    class CommonInfo(models.Model):
        name = models.CharField(max_length=100)
        age = models.PositiveIntegerField()
        class Meta:
            abstract = True
    class Student(CommonInfo):
        home_group = models.CharField(max_length=5)

       
    元繼承(繼承基類的Meta):
數據庫

    from django.db import models
    class CommonInfo(models.Model):
        # ...
        class Meta:
            abstract = True
            ordering = ['name']
    class Student(CommonInfo):
        # ...
        class Meta(CommonInfo.Meta):
            db_table = 'student_info'

           
    多表繼承:
 django

   from django.db import models
    class Place(models.Model):
        name = models.CharField(max_length=50)
        address = models.CharField(max_length=80)
    class Restaurant(Place):
        serves_hot_dogs = models.BooleanField(default=False)
        serves_pizza = models.BooleanField(default=False)

       
    代理繼承:
後端

    from django.db import models
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
    class MyPerson(Person):
        class Meta:
            proxy = True
        def do_something(self):
            # ...
            pass

 

 五、Meta 選項介紹

    abstract
    若是 abstract = True, 就表示模型是 抽象基類 (abstract base class).
安全

    app_label
    若是一個模型位於標準的位置以外(應用的models.py 或models 包),該模型必須定義它屬於哪一個應用:
    >=Django 1.7:定義在應用的models 模塊之外的模型,再也不須要app_label。
app

    db_table 
    該模型所用的數據表的名稱

    db_tablespace
    當前模型所使用的數據庫表空間 的名字。默認值是項目設置中的DEFAULT_TABLESPACE,若是它存在的話。若是後端並不支持表空間,這個選項能夠忽略。

    default_related_name
    >=Django 1.8+ 這個名字會默認被用於一個關聯對象到當前對象的關係。默認爲 <model_name>_set。
    因爲一個字段的反轉名稱應該是惟一的,當你給你的模型設計子類時,要格外當心。爲了規避名稱衝突,名稱的一部分應該含有'%(app_label)s'和'%(model_name)s',它們會被應用標籤的名稱和模型的名稱替換,兩者都是小寫的。詳見抽象模型的關聯名稱。

    get_latest_by
    模型中某個可排序的字段的名稱,好比DateField、DateTimeField或者IntegerField。它指定了Manager的latest()和earliest()中使用的默認字段。

    managed
    默認爲True,意思是Django在migrate命令中建立合適的數據表,而且會在 flush 管理命令中移除它們。換句話說,Django會管理這些數據表的生命週期。
若是是False,Django 就不會爲當前模型建立和刪除數據表。若是當前模型表示一個已經存在的,經過其它方法創建的數據庫視圖或者數據表,這會至關有用。這是設置爲managed=False時惟一的不一樣之處。

    order_with_respect_to
    按照給定的字段把這個對象標記爲」可排序的「。這一屬性一般用到關聯對象上面,使它在父對象中有序。
   
    ordering
    對象默認的順序。它是一個字符串的列表或元組。每一個字符串是一個字段名,前面帶有可選的「-」前綴表示倒序。前面沒有「-」的字段表示正序。使用"?"來表示隨機排序。

    permissions
    設置建立對象時權限表中額外的權限。增長、刪除和修改權限會自動爲每一個模型建立。它是一個包含二元組的元組或者列表,格式爲 (permission_code, human_readable_permission_name)。

    default_permissions
    >=Django 1.7.默認爲('add', 'change', 'delete')。你能夠自定義這個列表,好比,若是你的應用不須要默認權限中的任何一項,能夠把它設置成空列表。在模型被migrate命令建立以前,這個屬性必須被指定,以防一些遺漏的屬性被建立。

    proxy
    若是proxy = True, 做爲該模型子類的另外一個模型會被視爲代理模型。

    select_on_save
    默認爲False。該選項決定了Django是否採用1.6以前的 django.db.models.Model.save()算法。舊的算法使用SELECT來判斷是否存在須要更新的行。而新式的算法直接嘗試使用 UPDATE。在一些小几率的狀況中,一個已存在的行的UPDATE操做並不對Django可見。好比PostgreSQL的ON UPDATE觸發器會返回NULL。這種狀況下,新式的算法會在最後執行 INSERT 操做,即便這一行已經在數據庫中存在。

    unique_together
    用來設置的不重複的字段組合。它是一個元組的元組,組合起來的時候必須是惟一的。它在Django後臺中被使用,在數據庫層上約束數據(好比,在  CREATE TABLE  語句中包含  UNIQUE語句)。

    index_together
    用來設置帶有索引的字段組合.index_together = [["pub_date", "deadline"],] 列表中的字段將會創建索引(例如,會在CREATE INDEX語句中被使用)。
    >= Django 1.7.爲了方便起見,處理單一字段的集合時,index_together能夠是一個一維的列表。

    verbose_name
    對象的一個易於理解的名稱。若是此項沒有設置,Django會把類名拆分開來做爲自述名,好比CamelCase 會變成camel case,

    verbose_name_plural    該對象複數形式的名稱。若是此項沒有設置,Django 會使用 verbose_name + "s"。

相關文章
相關標籤/搜索