標籤:recent stream 上傳檔案 使用者 開發 HERE relax column 編輯
模型常用的欄位型別參數
<1> CharField
#字串欄位, 用於較短的字串.
#CharField 要求必須有一個參數 maxlength, 用於從資料庫層和Django校正層限制該欄位所允許的最大字元數.
<2> IntegerField
#用於儲存一個整數.
<3> FloatField
# 一個浮點數. 必須 提供兩個參數: 參數 描述
# max_digits 總位元(不包括小數點和符號)
# decimal_places 小數位元
# 舉例來說, 要儲存最大值為 999 (小數點後儲存2位),你要這樣定義欄位:
# models.FloatField(..., max_digits=5, decimal_places=2) # 共5位,其中2位是小數
# 要儲存最大值一百萬(小數點後儲存10位)的話,你要這樣定義:
# models.FloatField(..., max_digits=19, decimal_places=10) # 共19位,其中10位是小數
# admin 用一個文字框(<input type="text">)表示該欄位儲存的資料.
<4> AutoField
# 一個 IntegerField, 添加記錄時它會自動成長. 你通常不需要直接使用這個欄位;
# 自訂一個主鍵:my_id=models.AutoField(primary_key=True)
# 如果你不指定主鍵的話,系統會自動添加一個主鍵欄位到你的 model.
<5> BooleanField
# A true/false field. admin 用 checkbox 來表示此類欄位.
<6> TextField
# 一個容量很大的文字欄位.
# admin 用一個 <textarea> (文本地區)表示該欄位資料.(一個多行編輯框).
<7> EmailField
# 一個帶有檢查Email合法性的 CharField,Py3支援maxlength 參數.Py2不支援
<8> DateField
# 一個日期欄位. 共有下列額外的選擇性參數:
# Argument 描述
# auto_now 當對象被儲存時,自動將該欄位的值設定為目前時間.通常用於表示 "last-modified" 時間戳記.
# auto_now_add 當對象首次被建立時,自動將該欄位的值設定為目前時間.通常用於表示對象建立時間.
#(僅僅在admin中有意義...)
<9> DateTimeField
# 一個日期時間欄位. 類似 DateField 支援同樣的附加選項.
<10> ImageField
# 類似 FileField, 不過要校正上傳對象是否是一個合法圖片.#它有兩個選擇性參數:height_field和width_field,
# 如果提供這兩個參數,則圖片將按提供的高度和寬度規格儲存.
<11> FileField
# 一個檔案上傳欄位:要求一個必須有的參數: upload_to,
# upload_to:一個用於儲存上傳檔案的本地檔案系統路徑. 這個路徑必須包含 strftime#formatting,該格式將被上傳檔案的 date/time 替換(so that uploaded files don‘t fill up the given directory).
# admin 用一個<input type="file">組件表示該欄位儲存的資料(一個檔案上傳組件) .
注意:在一個 model 中使用 FileField 或 ImageField 需要以下步驟:
#(1)在你的 settings 檔案中, 定義一個完整路徑給 MEDIA_ROOT 以便讓 Django在此處儲存上傳檔案.
# (出於效能考慮,這些檔案並不儲存到資料庫.) 定義MEDIA_URL 作為該目錄的公用 URL. 要確保該目錄對
# WEB伺服器使用者帳號是可寫的.
#(2) 在你的 model 中添加 FileField 或 ImageField, 並確保定義了 upload_to 選項,以告訴 Django
# 使用 MEDIA_ROOT 的哪個子目錄儲存上傳檔案.你的資料庫中要儲存的只是檔案的路徑(相對於 MEDIA_ROOT).
# 出於習慣你一定很想使用 Django 提供的 get_<#fieldname>_url 函數.舉例來說,如果你的 ImageField
# 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 這樣的方式得到映像的絕對路徑.
<12> URLField
# 用於儲存 URL. 若 verify_exists 參數為 True (預設), 給定的 URL 會預先檢查是否存在( 即URL是否被有效裝入且
# 沒有返回404響應).
# admin 用一個 <input type="text"> 文字框表示該欄位儲存的資料(一個單行編輯框)
<13> NullBooleanField
# 類似 BooleanField, 不過允許 NULL 作為其中一個選項. 推薦使用這個欄位而不要用 BooleanField 加 null=True 選項
# admin 用一個選擇框 <select> (三個可選擇的值: "Unknown", "Yes" 和 "No" ) 來表示這種欄位資料.
<14> SlugField
# "Slug" 是一個報紙術語. slug 是某個東西的小小標記(短簽), 只包含字母,數字,底線和連字號.#它們通常用於URLs
# 若你使用 Django 開發版本,你可以指定 maxlength. 若 maxlength 未指定, Django 會使用預設長度: 50. #在
# 以前的 Django 版本,沒有任何辦法改變50 這個長度.
# 這暗示了 db_index=True.
# 它接受一個額外的參數: prepopulate_from, which is a list of fields from which to auto-#populate
# the slug, via JavaScript,in the object‘s admin form: models.SlugField
# (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.
<13> XMLField
#一個校正值是否為合法XML的 TextField,必須提供參數: schema_path, 它是一個用來校正文本的 RelaxNG schema #的檔案系統路徑.
<14> FilePathField
# 可選項目為某個特定目錄下的檔案名稱. 支援三個特殊的參數, 其中第一個是必須提供的.
# 參數 描述
# path 必需參數. 一個目錄的絕對檔案系統路徑. FilePathField 據此得到可選項目.
# Example: "/home/images".
# match 選擇性參數. 一個Regex, 作為一個字串, FilePathField 將使用它過濾檔案名稱.
# 注意這個Regex只會應用到 base filename 而不是
# 路徑全名. Example: "foo.*\.txt^", 將匹配檔案 foo23.txt 卻不匹配 bar.txt 或 foo23.gif.
# recursive選擇性參數.要麼 True 要麼 False. 預設值是 False. 是否包括 path 下面的全部子目錄.
# 這三個參數可以同時使用.
# match 僅應用於 base filename, 而不是路徑全名. 那麼,這個例子:
# FilePathField(path="/home/images", match="foo.*", recursive=True)
# ...會匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
<15> IPAddressField
# 一個字串形式的 IP 位址, (i.e. "24.124.1.30").
<16># CommaSeparatedIntegerField
# 用於存放逗號分隔的整數值. 類似 CharField, 必須要有maxlength參數.
Field重要參數
<1> null : 資料庫中欄位是否可以為空白
<2> blank: django的 Admin 中添加資料時是否可允許空值
<3> default:設定預設值
<4> editable:如果為假,admin模式下將不能改寫。預設為真
<5> primary_key:設定主鍵,如果沒有設定django建立表時會自動加上:
id = meta.AutoField(‘ID‘, primary_key=True)
primary_key=True implies blank=False, null=False and unique=True. Only one
primary key is allowed on an object.
<6> unique:資料唯一
<7> verbose_name Admin中欄位的顯示名稱
<8> validator_list:有效性檢查。非有效產生 django.core.validators.ValidationError 錯誤
<9> db_column,db_index 如果為真將為此欄位建立索引
<10>choices:一個用來選擇值的2維元組。第一個值是實際儲存的值,第二個用來方便進行選擇。
如SEX_CHOICES= (( ‘F’,‘Female’),(‘M’,‘Male’),)
gender = models.CharField(max_length=2,choices = SEX_CHOICES)
表操作之增刪改查
2018-01-25 08:20/2018-01-27 17:33
表操作之增 --------------create,save
單表操作之增
views.py
from blog.models import Bookfrom blog.models import Publishfrom blog.models import Authorfrom blog.models import AuthorDetaildef createAuthor(request): # create方式一: Author.objects.create(**{‘name‘: ‘FTL‘})# 利用字典,推薦使用 # create方式二: Author.objects.create(name="FTL") # save方式一: author = Author(name=‘FTL‘) author.save() # save方式二: author1 = Author() author1.name = ‘FTL‘ author1.save()
多表操作之增 ---一對多
views.py
# 一對多,外鍵表插入[外鍵在多的那一方建立]def createBook(request): # 方式一: 利用表id建立 Book.objects.create( title=‘Python‘, price=100, page_num=100, author_id=1, # 這裡1是指該book對象綁定了Authorr表中id=1的行對象 publish_id=1, # 這裡1是指該book對象綁定了Publisher表中id=1的行對象 publish_date=‘2020-01-01‘, ) # 方式二: 利用對象建立 author1 = Author.objects.get(id=2) publish1 = Publish.objects.get(id=2) Book.objects.create( title=‘Java‘, price=90, page_num=100, author=author1, # 這裡用我們自己建表時建立的對象綁定了通過get擷取的Authorr表中id=1對象 publish=publish1, # 這裡1是指該book對象綁定了Publisher表中id=1的1個對象 publish_date=‘2020-02-02‘, )
多表操作之增 ---多對多,many2many建立第三方表,但是ORM層無法create等操作[可放置任意對象]
正向查詢:
# 多對多,只能通過對象來進行綁定對象# 正向查詢author2 = Author.objects.get(id=3)author3 = Author.objects.filter(name=‘FTL‘)[0] # 返回的是一個author對象book2 = Book.objects.get(id=1)book2.author.add(author2, author3) # 給執行個體化的book2對象的author屬性添加2個author對象#book2.author.remove(author2, author3) # 給執行個體化的book2對象的author屬性刪除2個author對象# book2.author.add(*authors) # 給執行個體化的book2對象的authors【author是列表,必須帶*取值】 # 等同於使用列表[添加*]:book2.authors.add(*[author2, author3]) # 這裡是列表對象哈book2.authors.remove(*[author2, author3])
反向查詢:
# 反向查詢[author欄位定義在book裡面,所以可以根據book裡面的author屬性綁定對象]
# [反向是根據類名小寫獲得的,eg Book --> book]book3 = Book.objects.filter(id_gt=1) # 這裡是集合,uauthor4 = Author.objects.filter(id=1)[0]# 根據book_set找到Book中的author屬性,然後添加add()author4.book_set.add(*book3) # 注意添加* [這裡的book是類Book換成了小寫,固定用法]# author4.book_set.remove(*book3) # 注意添加* [這裡的book是類Book換成了小寫,固定用法]# -----------------------------------------------------------book3.author.add(1)book3.author.remove(1)author4.book_set.add(1)author4.book_set.remove(1)
多表操作之增 ---自己建立第三方表
/blog/models.py
# 如果自己建立第三張關係表,設定第三張表和另外2個表的關係[外鍵設定]:class Book2Author(models.Model): author =models.ForeignKey("Author") # 你是我的外鍵,同時我是你的外鍵 book = models.ForeignKey("Book") # 你是我的外鍵,同時我是你的外鍵# 建立author,book的執行個體化對象 author_obj= models.Author.objects.filter(id=2)[0] book_obj = models.Book.objects.filter(id=3)[0] s=models.Book2Author.objects.create(author_id=1,Book_id=2) # B2A對象添加資料 s.save() s=models.Book2Author(author=author_obj,Book_id=1) # B2A對象的屬性賦值一個B/A對象 s.save()# 定義屬性 class Meta: unique_together(‘author‘,‘book‘) # [聯合唯一]
單表操作之刪[先查後刪] --------------delete,remove,clear
單表操作之刪 --- 單表的串聯刪除 [django預設是串聯刪除的]
# 刪除方式一: 查詢資訊後過濾資訊刪除 delete()>>> Book.objects.filter(id=1).delete()(3, {‘app01.Book_authors‘: 2, ‘app01.Book‘: 1})
單表操作之刪 --- 多對多表的刪除
正向刪除:
book_del = Book.objects.filter(id=1) # 尋找出要刪除的book對象book_del.author.clear() # 清空與book中id=1 關聯的所有資料book_del.author.remove(2) # 刪除與book中author屬性id=2的所有資料book_del.author.remove(*[1, 2, 3, 4]) # 可以為列表,前面加*
反向刪除:
author = models.Author.objects.filter(id=1) # 尋找到id=1的authorauthor.book_set.clear() # 清空與book中id=1 關聯的所有資料
表操作之改[先查後改]--------------update,save
單表操作之改
# 方式一: save()book_update = Book.objects.get(id=1) # 尋找出要更新的id=1的book對象book_update.title = ‘C++‘ # 對這個對象的title內容進行修改book_update.save()# 方式二: fileter().update() 推薦使用Book.objects.filter(id=1).update(title=‘C++‘) # 更新id=1的book對象的title的內容
注意:
1、方式一 get返回的是一個model對象,它沒有update方法
方式二filter返回的是一個QuerySet對象[一堆集合],update是QuerySet對象的方法
(filter裡面的條件可能有多個條件符合,比如name=‘alvin‘,可能有兩個name=‘alvin‘的行資料)
2、方式一save方法會將所有屬性[資料中所有的列]重新設定一遍,效率低
方式二 update方法直接設定對應屬性,效率高
3、方式二 update方法的返回結果是一個整型, 該數字是修改資料庫的次數
多表操作之改
obj = Book.objects.filter(id=1)[0]author = Author.objects.filter(id__gt=2)obj.author.clear()obj.author.add(*author)
表操作之查--------------filter,value等
單表操作之查詢API
# <1>filter(**kwargs): 它包含了與所給篩選條件相匹配的對象【集合對象】# <2>all(): 查詢所有結果【集合對象】# <3>get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個【單個對象】 如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
單表操作之查詢結果再處理
#-----------下面的方法都是對查詢的結果再進行處理:比如 objects.filter.values()--------# <4>values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet【可迭代的字典序列】 該model的執行個體化對象,是一個可迭代的字典[{‘name‘:‘FTL‘},{‘title‘,‘Python‘},]title = Book.objects.filter(id=2).values(‘title‘) # <5>exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象# <6>order_by(*field): 對查詢結果排序Book.objects.order_by("-id") # 注意這裡是利用負號來進行反向的排序操作# <7>reverse(): 對查詢結果反向排序# <8>distinct(): 從返回結果中剔除重複紀錄# <9>values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列# <10>count(): 返回資料庫中匹配查詢(QuerySet)的對象數量。# <11>first(): 返回第一條記錄# <12>last(): 返回最後一條記錄# <13>exists(): 如果QuerySet包含資料,就返回True,否則返回False。 if exists():
單表操作之擴充查詢
#擴充查詢,有時候DJANGO的查詢API不能方便的設定查詢條件,提供了另外的擴充查詢方法extra:#extra(select=None, where=None, params=None, tables=None,order_by=None, select_params=None(1) Entry.objects.extra(select={‘is_recent‘: "pub_date > ‘2006-01-01‘"})(2) Blog.objects.extra( select=SortedDict([(‘a‘, ‘%s‘), (‘b‘, ‘%s‘)]), select_params=(‘one‘, ‘two‘))(3) q = Entry.objects.extra(select={‘is_recent‘: "pub_date > ‘2006-01-01‘"}) q = q.extra(order_by = [‘-is_recent‘])(4) Entry.objects.extra(where=[‘headline=%s‘], params=[‘Lennon‘]) 注意1: 如果2次操作之間有資料進行了修改 ,則需要重新從資料庫中查值,否則Django會從緩衝中取出資料,影響最後的查詢結果。 # objs=models.Book.objects.all() # [obj1,obj2,ob3...] # for obj in objs: # 每一obj就是一個行對象,此時會執行sql # print("obj:",obj) Models.Bool.update.get(id=2).update(‘title‘=‘YYY‘) # 資料庫內更改,緩衝未更改# objs=models.Book.objects.all() 重新從資料庫內尋找並賦值給objs# objs.update(title=‘YYY‘) 推薦使用,直接資料庫/記憶體都更改了,下面for迴圈查詢時重新執行了資料庫 # objs=models.Book.objects.all() # [obj1,obj2,ob3...] # for obj in objs: # print("obj:",obj) # 還是objs對象,所以從緩衝中取值正確操作: 1. 重新執行查詢 objs=models.Book.objects.all() 【不推薦】 2. 利用objs.update(title=‘YYY‘); 此時資料庫已經更改,緩衝內的值也做了更改注意2: if objs(): 查詢資料庫,並且將查詢的所有資料結果放入資料庫內 if objs.exist(): 僅僅查詢資料庫,但是不會把所有的資料放入資料庫內, if obj.iterator():資料放入迭代器內,用一次迭代一次取一次即可
表操作之設定作業日誌
LOGGING = { ‘version‘: 1, ‘disable_existing_loggers‘: False, ‘handlers‘: { ‘console‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.StreamHandler‘, }, }, ‘loggers‘: { ‘django.db.backends‘: { ‘handlers‘: [‘console‘], ‘propagate‘: True, ‘level‘:‘DEBUG‘, }, }}另:obj = Book.objects().values(‘publish_name‘)print(Obj.query) # 列印查詢SQL
Python學習---django之ORM的增刪改查180125