Django_ORM_字段屬性

Django_ORM_字段屬性

 經常使用字段

AutoField
int自增列,必填參 primary_key=True 默認會自動建立一個列名爲id的列 

IntegerField 一個整數類型,範圍在 -2147483648 to 2147483647
CharField 字符類型,必提供max_length參數, max_length表示字符長度
DateField 日期字段,日期格式 YYYY-MM-DD,至關於Python中的datetime.date()實例
DateTimeField 日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例

字段合集

  1 AutoField(Field)
  2         - int自增列,必須填入參數 primary_key=True
  3 
  4     BigAutoField(AutoField)
  5         - bigint自增列,必須填入參數 primary_key=True
  6 
  7         注:當model中若是沒有自增列,則自動會建立一個列名爲id的列
  8         from django.db import models
  9 
 10         class UserInfo(models.Model):
 11             # 自動建立一個列名爲id的且爲自增的整數列
 12             username = models.CharField(max_length=32)
 13 
 14         class Group(models.Model):
 15             # 自定義自增列
 16             nid = models.AutoField(primary_key=True)
 17             name = models.CharField(max_length=32)
 18 
 19     SmallIntegerField(IntegerField):
 20         - 小整數 -32768 ~ 32767
 21 
 22     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 23         - 正小整數 0 ~ 32767
 24     IntegerField(Field)
 25         - 整數列(有符號的) -2147483648 ~ 2147483647
 26 
 27     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 28         - 正整數 0 ~ 2147483647
 29 
 30     BigIntegerField(IntegerField):
 31         - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
 32 
 33     BooleanField(Field)
 34         - 布爾值類型
 35 
 36     NullBooleanField(Field):
 37         - 能夠爲空的布爾值
 38 
 39     CharField(Field)
 40         - 字符類型
 41         - 必須提供max_length參數, max_length表示字符長度
 42 
 43     TextField(Field)
 44         - 文本類型
 45 
 46     EmailField(CharField):
 47         - 字符串類型,Django Admin以及ModelForm中提供驗證機制
 48 
 49     IPAddressField(Field)
 50         - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
 51 
 52     GenericIPAddressField(Field)
 53         - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
 54         - 參數:
 55             protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
 56             unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓此功能,須要protocol="both"
 57 
 58     URLField(CharField)
 59         - 字符串類型,Django Admin以及ModelForm中提供驗證 URL
 60 
 61     SlugField(CharField)
 62         - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號)
 63 
 64     CommaSeparatedIntegerField(CharField)
 65         - 字符串類型,格式必須爲逗號分割的數字
 66 
 67     UUIDField(Field)
 68         - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證
 69 
 70     FilePathField(Field)
 71         - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
 72         - 參數:
 73                 path,                      文件夾路徑
 74                 match=None,                正則匹配
 75                 recursive=False,           遞歸下面的文件夾
 76                 allow_files=True,          容許文件
 77                 allow_folders=False,       容許文件夾
 78 
 79     FileField(Field)
 80         - 字符串,路徑保存在數據庫,文件上傳到指定目錄
 81         - 參數:
 82             upload_to = ""      上傳文件的保存路徑
 83             storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
 84 
 85     ImageField(FileField)
 86         - 字符串,路徑保存在數據庫,文件上傳到指定目錄
 87         - 參數:
 88             upload_to = ""      上傳文件的保存路徑
 89             storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
 90             width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
 91             height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)
 92 
 93     DateTimeField(DateField)
 94         - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
 95 
 96     DateField(DateTimeCheckMixin, Field)
 97         - 日期格式      YYYY-MM-DD
 98 
 99     TimeField(DateTimeCheckMixin, Field)
100         - 時間格式      HH:MM[:ss[.uuuuuu]]
101 
102     DurationField(Field)
103         - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型
104 
105     FloatField(Field)
106         - 浮點型
107 
108     DecimalField(Field)
109         - 10進制小數
110         - 參數:
111             max_digits,小數總長度
112             decimal_places,小數位長度
113 
114     BinaryField(Field)
115         - 二進制類型
116 
117 字段合集
View Code

字段參數

null	  用於表示某個字段能夠爲空 
unique	  若是設置爲unique=True 則該字段在此表中必須是惟一的 
db_index  若是db_index=True 則表明着爲此字段設置數據庫索引 
default	  爲該字段設置默認值

時間字段獨有

  DatetimeField、DateField、TimeField這個三個時間字段,均可以設置以下屬性python

# auto_now_add	  配置auto_now_add=True,建立數據記錄的時候會把當前時間添加到數據庫 
    #可用在生日

# auto_now	  配置上auto_now=True,每次更新數據記錄的時候會更新該字段 
    #可用在最近修改日期

關係字段

ForeignKey

  外鍵,一對多,多對一git

參數數據庫

to

  設置要關聯的表django

to_fied 

  設置要關聯的表的字段(不加這個,關聯的默認就是 id 字段)app

related_name   

  反向操做使用的字段名,用於代替原反向查詢時的  '表名_set' ide

栗子:spa

ForeignKey字段中未添加參數 related_name code

class Classes(models.Model):   
  name = models.CharField(max_length=32) 
class Student(models.Model):  
  name = models.CharField(max_length=32)
  theclass = models.ForeignKey(to="Classes")

查詢某個班級關聯的全部學生(反向查詢)時orm

models.Classes.objects.first().student_set.all()

ForeignKey字段中添加了參數 related_name 後對象

class Student(models.Model):
  name = models.CharField(max_length=32)
  theclass = models.ForeignKey(to="Classes", related_name="students")

查詢某個班級關聯的全部學生(反向查詢)時

models.Classes.objects.first().students.all()

related_query_name       

  反向查詢操做時,雙下滑查詢的時候能夠替換表名

on_delete                       

  當刪除關聯表中的數據時,當前表與其關聯的行的行爲

  默認 1.0版本中會設置爲on_delete = models.CASCADE

取值:

  models.CASCADE          刪除關聯數據,與之關聯也刪除
    2.0 版本中不會自動添加這個.須要手動添加此參數
  
  models.DO_NOTHING 刪除關聯數據,引起錯誤IntegrityError   models.PROTECT 刪除關聯數據,引起錯誤ProtectedError   models.SET_NULL 刪除關聯數據,與之關聯的值設置爲null(前提FK字段須要設置爲可空)   models.SET_DEFAULT 刪除關聯數據,與之關聯的值設置爲默認值(前提FK字段須要設置默認值)   models.SET 刪除關聯數據,     a. 與之關聯的值設置爲指定值,設置:models.SET(值)     b. 與之關聯的值設置爲可執行對象的返回值,設置:models.SET(可執行對象)

栗子

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
    to="User",
    to_field="id",
    on_delete=models.SET(func)
    ) 

db_constraint             

  是否在數據庫中建立外鍵約束,默認爲True

  設置成 False 後,將取消約束,即軟關聯, 至關於外鍵失效

    一般咱們都是用代碼去限制關聯,而不是經過數據庫

    數據庫設置的外鍵管理太死了,不靈活,後續維護麻煩

limit_choices_to = {"field":"filter_val"}  

  在Admin或ModelForm中顯示關聯數據時,提供的條件

實例:

# models.py
tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',limit_choices_to={"depart":1001})

UserInfo.objects.filter(depart
=1001])

OneToOneField 一對一關聯

參數

to    設置要關聯的表
to_field    設置要關聯的字段
on_delete    同ForeignKey字段

ManyToManyField 多對多

參數

to 設置要關聯的表

related_name 同ForeignKey字段
related_query_name 同ForeignKey字段
symmetrical 僅用於多對多自關聯時,指定內部是否建立反向操做的字段 默認爲True
through 使用ManyToManyField字段,Django將自動生成一張表來管理多對多的關聯關係   手動建立第三張表來管理多對多關係,須要經過through來指定第三張表的表名
through_fields 設置關聯的字段
db_table 默認建立第三張表時,數據庫中表的名稱

 

栗子

class Person(models.Model):
  name = models.CharField(max_length=16)
  friends = models.ManyToManyField("self")
  # 此時,person對象就沒有person_set屬性

class Person(models.Model):
  name = models.CharField(max_length=16)
  friends = models.ManyToManyField("self", symmetrical=False)
  # 此時,person對象如今就可使用person_set屬性進行反向查詢 

 

 

多對多關聯關係的三種方式

方式一:自行建立第三張表

 1 class Book(models.Model):
 2   title = models.CharField(max_length=32, verbose_name="書名")
 3 class Author(models.Model):
 4   name = models.CharField(max_length=32, verbose_name="做者姓名")
 5 
 6 # 本身建立第三張表,分別經過外鍵關聯書和做者
 7 class Author2Book(models.Model):
 8   author = models.ForeignKey(to="Author")
 9   book = models.ForeignKey(to="Book")
10 class Meta:
11   unique_together = ("author", "book")

方式二:經過ManyToManyField自動建立第三張表

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="書名")


# 經過ORM自帶的ManyToManyField自動建立第三張表 class Author(models.Model):   name = models.CharField(max_length=32, verbose_name="做者姓名")   books = models.ManyToManyField(to="Book", related_name="authors")

方式三:設置ManyTomanyField並指定自行建立的第三張表

class Book(models.Model):
  title = models.CharField(max_length=32, verbose_name="書名")

# 本身建立第三張表,並經過ManyToManyField指定關聯
class Author(models.Model):
  name = models.CharField(max_length=32, verbose_name="做者姓名")
  books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))

# through_fields接受一個2元組('field1','field2'):
# 其中field1是定義ManyToManyField的模型外鍵的名(author),field2是關聯目標模型(book)的外鍵名 
class Author2Book(models.Model):
  author = models.ForeignKey(to="Author")
  book = models.ForeignKey(to="Book")
class Meta:
  unique_together = ("author", "book")

 

取捨

當咱們須要在第三張關係表中存儲額外的字段時,就要使用第三種方式

可是當咱們使用第三種方式建立多對多關聯關係時, 就沒法使用set、add、remove、clear方法來管理多對多的關係了,

須要經過第三張表的model來管理多對多關係

元信息

  ORM對應的類裏面包含另外一個Meta類,而Meta類封裝了一些數據庫的信息 主要字段以下:

  • db_table ORM在數據庫中的表名默認是 app_類名,能夠經過db_table能夠重寫表名
  • index_together 聯合索引
  • unique_together 聯合惟一索引
  • ordering 指定默認按什麼字段排序
    • 只有設置了該屬性,咱們查詢到的結果才能夠被reverse()

 栗子:

class Author2Book(models.Model):
  author = models.ForeignKey(to="Author")
  book = models.ForeignKey(to="Book")
  def __str__(self):
    return self.name
  class Meta:
    db_table = "author2book"
    unique_together = ("author", "book")
相關文章
相關標籤/搜索