django中models field詳解

在model中添加字段的格式一般爲:  field_name = field_type(**field_options)

 

一  field options(所有字段共用)

  1  null   默認爲False,True則表示可以爲null。(空字符串在數據庫中可能被存儲爲'')

  2  blank  默認爲False,True表示可以爲空。

  3  choice  可選的,限制了該選項的字段值必須是所指定的choice中的一個。

複製代碼

from django.db import modelsclass Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),      #第一個參數是真正的model參數,#第二個參數則是方便人們理解閱讀
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )    def is_upperclass(self):        return self.year_in_school in (self.JUNIOR, self.SENIOR)

複製代碼

View Code

   4  db_column  數據庫column名稱。默認爲本字段的名稱。

  5  db_index  如果爲True的話,該字段的數據庫索引將會被創建

  6  default   設置該字段的默認值,可以是值也可以是對象。

  7  editable   默認爲True,若爲False,則不會在admin/界面顯示

  8  primary_key  若設置爲True,則表示將該字段設置爲主鍵。一般情況下django默認會設置一個自增長的id主鍵。

  9  unique   若設置爲True,該字段值不可重複

二  field type(字段類型,細分的話可以分爲普通字段以及關係字段)

 1  普通字段

  1  AutoField()  根據已有id自增長的整形唯一字段,一般每個model類不需設置該字段,因爲django會爲每個model自動設置。

    django默認會爲每個model類添加如下語句:id = models.AutoField(primary_key=True)  當其他字段添加了primary_key屬性,則不會創建id字段了

    每個model類僅能有一個主鍵

  2  BooleanField()  布爾型字段,默認的表單窗口部件是CheckBoxInput

  3  CharField()  字符型字段,默認的表單窗口部件是TextInput。該字段類型有一個必需參數:max_length  在數據庫水平限定了字符串最大長度

  4  DateField()  日期字段,字段的值是python中datetime.date的實例,默認的表單窗口是TextInput有幾個可選的參數:

    auto_now=True/False:當設置爲True時,每當該對象使用save()時,該字段的值就會被更新。

    auto_now_add=True/False: 當設置爲True時,該字段的值爲該對象被創建時的日期

  5  DateTimeField()  日期和時間字段,值爲datetime.datetime實例。默認的表單窗口以及可選參數同上。

  6  DecimalField()  混合精度的小數型數字字段。有兩個必需的參數:

    max_digits=ingt_number:限定數字的最大位數(包含小數位)

    decimal_places=int_number:存儲數字的小數位

#to store numbers up to 999 with a resolution of 2 decimal places, you’d usemodels.DecimalField(..., max_digits=5, decimal_places=2)

   7  EmailField(max_length=254, **options)  郵件字段,使用EmailValidator進行驗證

  8  FileField(upload_to=None, max_length=100, **options)  文件上傳字段。

  這個字段不能設置primary_key和unique選項.在數據庫中存儲類型是varchar,默認最大長度爲100.

  有兩個可選參數:

    upload_to

      如果使用默認的FileSystomStorage,文件將會存儲到settings文件中配置的MEDIA_ROOT路徑中。

      upload_to的值也可以爲可調用對象,通過調用這個對象可以獲得上傳路徑。

        instance=:  定義了FileField的模型實例

        filename='':  文件名稱。

class MyModel01(models.Model):    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')#upload_to=可調用對象def user_directory_path(instance, filename):    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)class MyModel02(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

實例

    storage  用來設定文件存儲倉庫    

  9  FilePathField(path=None, match=None, recursive=False, max_length=100, **options)

    這個字段的值被限制在系統上某個目錄中的所有文件名集合中。有三個參數

    path='':  該參數必需。上行所說的‘某個目錄’的絕對路徑。Example: "/home/images".

    match='pattern':  可選參數。格式是正則表達式。用來揀選符合匹配正則表達式的文件

    recursive=True/False: 可選參數,默認爲False。設定是否遞歸該目錄下所有子目錄的所有文件。    

FilePathField(path="/home/images", match="foo.*", recursive=True)

  10  FloatField()  浮點字段,默認的表單窗口部件是NumberInput。和DecimalField經常混淆不清,

    FloatField在內部使用Python中的float對象,而DecimalField在內部使用Python中的decimal對象。

  11  ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options

    圖像字段。繼承了FileField的所有屬性和方法。而且還能自動驗證上傳的對象是否爲合法的圖像。

  12  IntegerField  整形字段。

  13  GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)  ip地址字段

    protocol='both/ipv4/ipv6'  默認爲both

    unpack_ipv4   用處不大。

  14  NullBooleanField  類似於BooleanField,不同的是其允許值爲null

  15  TextField()   與CharField類似,但一般用來存儲體積較大的文本。

  16  TimeField(auto_now=False, auto_now_add=False, **options)   時間字段,其值爲datetime.time實例

  17  URLField(max_length=200, **options)    URL字段

    類似於CharField的子類,默認最大長度爲200.

  18  UUIDField(**options)  通用唯一標識字段,當不想用django默認設置的AutoField字段時,可以用該字段代替。

 

  2  關係字段

  關係字段:一對一,多對一,多對多

  一對一:  現在有很多一對一輔導班,也就是上課時,一個老師對應一個學生,一個學生對應一個老師

  多對一:  很多偏遠山區的學校可能整個學校只有一個老師,這一個老師對應多個學生,所有的學生對應這一個老師

  多對多:  而我們則很幸福,學校裏有許多老師,一個老師教習一科,學生有多個老師,老師有多個學生。

  1  ForeignKey(othermodel, on_delete, **options)  多對一或者一對多或者外鍵字段。

    othermodel:  所關聯的模型,'多' model使用外鍵關聯  '一'model。

      當所關聯的模型爲他自己時,使用'self'

      當引用的模型爲其他app中的模型時,要加上app名稱標籤:  'app_name.model_name'

      數據庫會自動在外鍵字段上創建索引,可以使用de_index=False關閉該功能。

    on_delete: 當刪除 "一" 模型對象時,django會根據該參數的值對與該對象相關聯的其他對象(也就是 ‘多’)進行操作。

        在django1.9以及之前的版本中,on_delete作爲一個關鍵字參數。而在1.10則可以作爲第二個參數

      models.CASCADE:   默認爲models.CASCADE   級聯刪除。當刪除'一'時,‘多’會被刪除。比如:

# mysite項目下名爲polls的app中的models.pyclass follower(models.Model):
    name = models.CharField(max_length=200)
    menpai = models.ForeignKey('menpai', on_delete=models.CASCADE)  #定義了models.CASCADE屬性

    def __str__(self):        return self.nameclass menpai(models.Model):
    name = models.CharField(max_length=200)    def __str__(self):        return self.name#運行 python3 manager.py shell進入交互頁面>>> from polls.models import follower,menpai>>> m1=menpai(name='huashanpai')   
>>> m1.save()>>> m2=menpai(name='riyuejiao')>>> m2.save()>>> f1=follower(name='linghuchong',menpai=m1)>>> f1.save()>>> f2=follower(name='renwoxing',menpai=m2)>>> f2.save()>>> f1.menpai<menpai: huashanpai>
>>> m1.delete()
(2, {'polls.menpai': 1, 'polls.follower': 1})   # 刪除華山派時,將令狐沖也刪除了

View Code

      modles.PROTECT :    當刪除一個具有外鍵關係的對象時,會引發一個異常,阻止刪除該對象

      models.SET_NULL:   設置刪除對象所關聯的外鍵字段爲null。但字段的null屬性必需爲True

      models.SET_DEFAULT :    設置刪除對象所關聯的外鍵字段爲默認的值。

      models.SET(value)  :設置刪除對象所關聯的對象的外鍵字段爲value,value也可以是一個可調用函數。

from django.conf import settingsfrom django.contrib.auth import get_user_modelfrom django.db import modelsdef get_sentinel_user():    return get_user_model().objects.get_or_create(username='deleted')[0]class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )

models.SET()實例

      models.DO_NOTHING :  不做任何操作

    limit_choices_to  限制該字段爲選項形。格式:limit_choices_to={'is_staff': True}。值也可以爲可調用函數。

def limit_pub_date_choices():    return {'pub_date__lte': datetime.date.utcnow()}

limit_choices_to = limit_pub_date_choices

實例

    related_name  設置從關聯對象到自身的關係的名稱,若值爲'+'  則關聯對象與自身無逆向關係。詳解請看官方文檔

    to_field  設置所關聯對象的關聯字段。默認爲關聯對象的主鍵字段。

    

  2  ManyToManyField(othermodel, **options)  多對多字段。

    othermodel:  所關聯的model名稱

    db_table:  多對多關係會在兩個模型所對應的表中間創建一個‘中間表’ ,將多對多轉換爲兩個多對一,該選項爲這個中間表設置名稱。一般來說django會默認爲中間表創建名稱,但人們讀起來可能搞不清楚究竟中間表關聯到了哪裏。

    related_name:  同多對一字段中的related_name

    limite_choices_to:  同....

    symmetrical:  當多對多關聯對象爲自身時可能會用到的參數。默認爲True。a,b同屬於person模型,person中的friends字段與自身設置了多對多關係,當該值設置爲True時,django假定關係爲對稱,即:a是b的朋友,那麼b也是a的朋友。設置爲False時,django會強制爲逆向關係創建描述信息。

    though:  不想讓django自動創建中間表,手動創建中間表所對應的model,通過though指定對應的model名稱。

    though_field:  當though參數被使用時,該參數纔會有效。指定使用哪些中間模型字段來確立兩個模型的多對多關係。

  3  OneToOneField(othermodel, on_delete, parent_link=False, **options)  一對一字段。

    othermodel: .......

    on_delete:........

    related_name:...........


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章