日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django model

發(fā)布時間:2024/10/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django model 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文一篇完全介紹django的最重要的model

6.django model

模型是數(shù)據(jù)唯一而且準(zhǔn)確的信息來源。它包含正在儲存的數(shù)據(jù)的重要字段和行為。一般來說,每一個模型都映射一個數(shù)據(jù)庫表。

這個模型定義了一個 Person, 其擁有 first_name 和 last_name:

from?django.db?import?models

class?Person(models.Model):
????first_name?=?models.CharField(max_length=30)
????last_name?=?models.CharField(max_length=30)

但是對于大多數(shù)的模型都是要機構(gòu)字段相同的,需要創(chuàng)建base.model(一般的位置再utils文件夾中)

from?django.db?import?models

class?BaseModel(models.Model):
????'''
????基類?公共字段
????'''

????create_time?=?models.DateTimeField('創(chuàng)建時間',auto_now_add=True)
????update_time?=?models.DateTimeField('修改時間',auto_now?=?True)
????is_delete?=?models.BooleanField('邏輯刪除',default=False)
????class?Meta:
????????#?抽象類,?用于繼承,遷移的時候不創(chuàng)建
????????abstract?=?True

對于抽象的模型如用戶注冊的AbstractUser,遷移時不應(yīng)該創(chuàng)建

Meta

使用內(nèi)部 Meta類 來給模型賦予元數(shù)據(jù)

#?這里的basemodel是上面的
class?Teacher(BaseModel):
????name?=?models.CharField('講師姓名',?max_length=150,?help_text='講師名字')
????title?=?models.CharField('職稱',?max_length=150,?help_text='職稱')
????profile?=?models.TextField('簡介',?help_text='簡介')
????photo?=?models.URLField('頭像url',?default='',?help_text='頭像url')

????class?Meta:
????????db_table?=?'tb_teachers'
????????verbose_name?=?'講師'
????????verbose_name_plural?=?verbose_name

????def?__str__(self):
????????return?self.name

下面是Meta常用選項

  • abstract

這個屬性是定義當(dāng)前的模型是不是一個抽象類。所謂抽象類是不會對應(yīng)數(shù)據(jù)庫表的。如果abstract = True 這個model就是一個抽象類

  • app_label

這個選型只在一種情況下使用,就是你的模型不在默認的應(yīng)用程序包下的models.py文件中,這時候需要指定你這個模型是哪個應(yīng)用程序的。app_label = 'myapp'

  • db_table

db_table是指定自定義數(shù)據(jù)庫表明的。Django有一套默認的按照一定規(guī)則生成數(shù)據(jù)模型對應(yīng)的數(shù)據(jù)庫表明。定義該model在數(shù)據(jù)庫中的表名稱db_table = 'Students'

  • get_latest_by

在model中指定一個DateField或者DateTimeField。這個設(shè)置讓你在使用model的Manager上的lastest方法時,默認使用指定字段來排序

  • managed

默認值為True,這意味著Django可以使用syncdb和reset命令來創(chuàng)建或移除對應(yīng)的數(shù)據(jù)庫。默認值為True,如果你不希望這么做,可以把manage的值設(shè)置為False

  • order_with_respect_to

這個選項一般用于多對多的關(guān)系中,它指向一個關(guān)聯(lián)對象,就是說關(guān)聯(lián)對象找到這個對象后它是經(jīng)過排序的。指定這個屬性后你會得到一個get_xxx_order()和set_xxx_order()的方法,通過它們你可以設(shè)置或者回去排序的對象

  • ordering

這個字段是告訴Django模型對象返回的記錄結(jié)果集是按照哪個字段排序的。這是一個字符串的元組或列表,沒有一個字符串都是一個字段和用一個可選的表明降序的'-'構(gòu)成。當(dāng)字段名前面沒有'-'時,將默認使用升序排列。使用'?'將會隨機排列

ordering=['order_date']?#?按訂單升序排列
ordering=['-order_date']?#?按訂單降序排列,-表示降序
ordering=['?order_date']?#?隨機排序,?表示隨機
ordering=['-pub_date','author']?#?以pub_date為降序,在以author升序排列
  • permissions

permissions主要是為了在Django Admin管理模塊下使用的,如果你設(shè)置了這個屬性可以讓指定的方法權(quán)限描述更清晰可讀。Django自動為每個設(shè)置了admin的對象創(chuàng)建添加,刪除和修改的權(quán)限。

permissions?=?(('can_deliver_pizzas','Can?deliver?pizzas'))

  • proxy

這是為了實現(xiàn)代理模型使用的,如果proxy = True,表示model是其父的代理 model

  • unique_together

unique_together這個選項用于:當(dāng)你需要通過兩個字段保持唯一性時使用。比如假設(shè)你希望,一個Person的FirstName和LastName兩者的組合必須是唯一的,那么需要這樣設(shè)置:unique_together = (("first_name", "last_name"),)

注意:一個ManyToManyField不能包含在unique_together中。

如果你需要驗證關(guān)聯(lián)到ManyToManyField字段的唯一驗證,嘗試使用signal(信號)或者明確指定through屬性。

  • verbose_name

verbose_name的意思很簡單,就是給你的模型類起一個更可讀的名字一般定義為中文,我們:
verbose_name = "學(xué)校"

  • verbose_name_plural

這個選項是指定,模型的復(fù)數(shù)形式是什么,比如verbose_name_plural = "學(xué)校"如果不指定Django會自動在模型名稱后加一個’s’

字段類型

  • models.CharField

字符串類型。必須接收一個max_length參數(shù).最常用的filed,沒有之一!

  • models.TextField  

大量文本內(nèi)容,在HTML中表現(xiàn)為Textarea標(biāo)簽,最常用的字段類型之一!

  • models.BooleanField

在HTML表單中體現(xiàn)為CheckboxInput標(biāo)簽。如果要接收null值,請使用NullBooleanField。

  • models.IntegerField

整數(shù)類型,最常用的字段之一。取值范圍-2147483648到2147483647。在HTML中表現(xiàn)為NumberInput標(biāo)簽。優(yōu)先級一般使用這個字段

  • models.URLField  

字符串類型,地址正則表達式,默認最大長度200。

  • models.BinaryField 

二進制數(shù)據(jù)類型。使用受限,少用。

  • models.ImageField 圖片

  • models.FilePathField 文件

  • models.AutoField  自增列=int(11)

通常你不需要自己編寫它,Django會自動幫你添加字段:id = models.AutoField(primary_key=True),如果沒有的話,默認會生成一個名稱為id的列,如果要顯示的定義一個自增列,或者如果你非要自己設(shè)置主鍵,那么請務(wù)必將字段設(shè)置為primary_key=True。

注意: Django在一個模型中只允許有一個自增字段,并且該字段必須為主鍵!

  • models.DateField  日期字段類型date

注意:參數(shù)auto_now=True表示每次更新都會更新這個時間;參數(shù)auto_now_add表示只是第一次創(chuàng)建時添加,之后的更新不再改變

  • models.DateTimeField  

日期時間類型。Python的datetime.datetime的實例。與DateField相比就是多了小時、分和秒的顯示,其它功能、參數(shù)、用法、默認值等等都一樣

  • models.TimeField  

時間字段,Python中datetime.time的實例。 HH:MM[:ss[.uuuuuu]]

  • models.Decimal  

十進制小數(shù)類型=decimal,必須指定整數(shù)位max_digits和小數(shù)位decimal_places

  • models.EmailField  

字符串類型(正則表達式郵箱)=varchar 對字符串進行正則表達式驗證,使用DJango內(nèi)置的EmailValidator進行郵箱地址合法性驗證。

  • models.FloatField  

浮點類型=double

  • models.IntegerField  

整形

  • models.BigIntegerField 

長整形

integer_field_ranges?=?{
    'SmallIntegerField':?(-32768,?32767),
    'IntegerField':?(-2147483648,?2147483647),
    'BigIntegerField':?(-9223372036854775808,?9223372036854775807),
    'PositiveSmallIntegerField':?(0,?32767),
    'PositiveIntegerField':?(0,?2147483647),
  }
  • models.IPAddressField  

字符串類型(ip4正則表達式)

  • models.GenericIPAddressField 

字符串類型(ip4和ip6是可選的)參數(shù)protocol可以是:both、ipv4、ipv6 驗證時,會根據(jù)設(shè)置進行報錯

  • models.NullBooleanField  

  • models.ComaSeparatedIntegerField  

用逗號分割的數(shù)字類型=varchar 繼承CharField,所以必須加max_lenght參數(shù)

主要講幾個重要的字段

CharField 和

TextField

三個必要參數(shù)

  • 名稱
  • max_length
  • help_text
title?=?models.CharField('課程名',?max_length=150,?help_text='課程名')
profile?=?models.TextField('課程簡介',?null=True,?blank=True,?help_text='課程簡介')

改寫字段傳入validators參數(shù)改寫的函數(shù)

  • null=True(默認是false,不能為空)
  • blank=True 表示代碼中創(chuàng)建數(shù)據(jù)庫記錄時該字段可傳空白(空串,空字符串).
  • default 默認為

FileField 和ImageField

上傳文件字段(不能設(shè)置為主鍵)。默認情況下,該字段在HTML中表現(xiàn)為一個ClearableFileInput標(biāo)簽。

class?MyModel(models.Model):
????photo?=?ImageField(upload_to?=?'photos/')
????#實際的路徑就是?MEDIA_ROOT/photos/filename
????#所以可以用uoload_to來指定文件存放的前綴路徑
????#FileField也是同樣的定義
  • height_field=None
  • width_field=None

height_field參數(shù):保存有圖片高度信息的模型字段名。 width_field參數(shù):保存有圖片寬度信息的模型字段名。

DateTimeField

  • DateTimeField.auto_now

這個參數(shù)的默認值為false,設(shè)置為true時,能夠在保存該字段時,將其值設(shè)置為當(dāng)前時間,并且每次修改model,都會自動更新。

  • DateTimeField.auto_now_add

這個參數(shù)的默認值也為False,設(shè)置為True時,會在model對象第一次被創(chuàng)建時,將字段的值設(shè)置為創(chuàng)建時的時間,以后修改對象時,字段的值不會再更新。

class?BaseModel(models.Model):
????'''
????基類?公共字段
????'''

????create_time?=?models.DateTimeField('創(chuàng)建時間',auto_now_add=True)
????update_time?=?models.DateTimeField('修改時間',auto_now?=?True)
????is_delete?=?models.BooleanField('邏輯刪除',default=False)
????class?Meta:
????????#?抽象類,?用于繼承,遷移的時候不創(chuàng)建
????????abstract?=?True

字段常用參數(shù)

  • null

如果是True,Django會在數(shù)據(jù)庫中將此字段的值置為NULL,默認值是False

  • blank

如果為True時django的 Admin 中添加數(shù)據(jù)時可允許空值,可以不填。如果為False則必須填。默認是False。
null純粹是與數(shù)據(jù)庫有關(guān)系的。而blank是與頁面必填項驗證有關(guān)的

  • primary_key = False

主鍵,對AutoField設(shè)置主鍵后,就會代替原來的自增 id 列

  • bauto_now 和 auto_now_add

auto_now 自動創(chuàng)建---無論添加或修改,都是當(dāng)前操作的時間
auto_now_add 自動創(chuàng)建---永遠是創(chuàng)建時的時間

  • choices

一個二維的元組被用作choices,如果這樣定義,Django會select box代替普通的文本框,
并且限定choices的值是元組中的值

GENDER_CHOICE?=?(
????????????(u'M',?u'Male'),
????????????(u'F',?u'Female'),
??????)
??????gender?=?models.CharField(max_length=2,choices?=?GENDER_CHOICE)

  • max_length

字段長度

  • default

    默認值

  • verbose_name  

Admin中字段的顯示名稱,如果不設(shè)置該參數(shù)時,則與屬性名。

  • db_column  

    數(shù)據(jù)庫中的字段名稱

  • unique=True  

不允許重復(fù)

  • db_index = True  

數(shù)據(jù)庫索引

  • meditable=True

在Admin里是否可編輯

  • error_messages=None  

    錯誤提示

  • auto_created=False  
    自動創(chuàng)建

  • help_text 
     
    在Admin中提示幫助信息

  • validators=[]

驗證器

  • upload-to

文件上傳時的保存上傳文件的目錄

模型關(guān)系

基本原則:

  • 一對一的表,兩表的屬性實際上完全可以合并成一個表,共用一個主鍵即可;
  • 一對多的表,可以設(shè)中間關(guān)聯(lián)表,也可以將關(guān)聯(lián)表并入“多”這頭;若設(shè)獨立關(guān)聯(lián)表,則可引入“多”這頭的主鍵作為其主鍵,也可另立主鍵并將“一”和“多”兩表的主鍵作為關(guān)聯(lián)表的外鍵;
  • 多對多的表,則必須設(shè)中間關(guān)聯(lián)表,關(guān)聯(lián)表設(shè)獨立主鍵,并引入兩個“多”頭的表的主鍵作為關(guān)聯(lián)表的外鍵。
ForeignKey:?一對多
ManyToManyField:多對多
OneToOneField:????一對一

on_delete參數(shù)說明:

有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值

  • CASCADE:此值設(shè)置,是級聯(lián)刪除。

  • PROTECT:此值設(shè)置,是會報完整性錯誤。

  • SET_NULL:此值設(shè)置,會把外鍵設(shè)置為null,前提是允許為null。

  • SET_DEFAULT:此值設(shè)置,會把設(shè)置為外鍵的默認值。

  • SET():此值設(shè)置,會調(diào)用外面的值,可以是一個函數(shù)。

一對一: 一個學(xué)生只有一個學(xué)號
一對多: 一個學(xué)生有多個課程
多對多:多個學(xué)生有多個課程

一對多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(可以被重復(fù)選擇)
一個學(xué)院信息表有多個學(xué)生的信息表

再比如文章和作者之間的關(guān)系。一個文章只能由一個作者編寫,但是一個作者可以寫多篇文章。文章和作者之間的關(guān)系就是典型的多對一的關(guān)系。作者和文章的關(guān)系就是一對多。

多對多:在某表中創(chuàng)建一行數(shù)據(jù)是,有一個可以多選的下拉框
不同的學(xué)生有不同課程表

再比如文章和標(biāo)簽的關(guān)系。一篇文章可以有多個標(biāo)簽,一個標(biāo)簽可以被多個文章所引用。因此標(biāo)簽和文章的關(guān)系是典型的多對多的關(guān)系。

一對一:在某表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(下拉框中的內(nèi)容被用過一次就消失了)
一個學(xué)生信息表就只用一個對應(yīng)的詳細信息表

再比如一個用戶表和一個用戶信息表。在實際網(wǎng)站中,可能需要保存用戶的許多信息,但是有些信息是不經(jīng)常用的。如果把所有信息都存放到一張表中可能會影響查詢效率,因此可以把用戶的一些不常用的信息存放到另外一張表中我們叫做UserExtension。但是用戶表User和用戶信息表UserExtension就是典型的一對一了。

案例深入

在這里插入圖片描述、

一個學(xué)生只有一個學(xué)生的信息詳細表,多個學(xué)生有多個課程,通過中間關(guān)聯(lián)表就是學(xué)生報名表

在這里插入圖片描述
在多對多中必須through=‘Enroll' 就是有Enroll表才能有課程表,想下沒有學(xué)生報名還上什么課,必須設(shè)中間關(guān)聯(lián)表就是學(xué)生報名表
在這里插入圖片描述

如果沒有學(xué)生,沒有課程來報名上學(xué)干嘛,所以是多對一,多個學(xué)生合成一張報名表

注意:外鍵和一對一關(guān)系的時候需要加on_delete選項,此參數(shù)為了避免兩個表里的數(shù)據(jù)不一致問題,不然會報錯!
一般使用CASCADE 表示級聯(lián)刪除

也就是有一個數(shù)據(jù)其中一個表刪了,管聊的表就會刪除,想下如果有個學(xué)生不讀了,刪掉了所有學(xué)生報名表中的數(shù)據(jù),它綁的外鍵的學(xué)生,課程,是不是先把它刪了,這就是級聯(lián)刪除,如果設(shè)置了SET_NULL就是把學(xué)生的信息刪了,它人留下來,下次在補信息就ok了

def str(self):

這個str的作用是美化打印出來的結(jié)果,使人類更方便查看

class?Test:

????def?__init__(self,?name,?job):
????????self.name?=?name
????????self.job?=?job

????def?__str__(self):
????????return?'Name:'?+?self.name
instance?=?Test('maoli',?'student')
print(instance)
Name:?maoli

補充

#?必需字段
#?沒有mobile就不行
REQUIRED_FIELDS?=?['mobile']
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的django model的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。