django中models field詳解


本文參考自: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 models

class 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 use
models.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.py
class follower(models.Model):
    name = models.CharField(max_length=200)
    menpai = models.ForeignKey('menpai', on_delete=models.CASCADE)  #定義了models.CASCADE屬性

    def __str__(self):
        return self.name

class 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 settings
from django.contrib.auth import get_user_model
from django.db import models

def 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:...........



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM