Django數據庫使用遇到的坑

設置字段爲空

Django創建數據表時,默認字段不能爲空,要想其爲空,需要在字段後添加參數,

null=True   表示數據字段可爲空

如果還想在django的Admin中維護數據時也可允許空值,需要再加一個參數  

blank=True  

因爲Django自動做了數據驗證不允許字段爲空,如果想要在Django中也可以將字段保存爲空值,就需要添加該參數。

使用pandas的to_sql批量插入

django自帶批插入函數bulk_create,但效率不是很高,如果數據源是DataFrame格式的,則數據插入沒有DataFrame的to_sql速度快,但目前to_sql只支持mysql和sqlite3,所以用這兩個數據庫的可以考慮使用to_sql插入數據。方法很簡單,以sqlite3爲例:

import pandas
import sqlite3


engine = settings.DATABASES['default']['NAME']
cn = sqlite3.connect(engine)
df.to_sql(tablename, cn, index=False, if_exists='append')

如果需要把index作爲一列插入,則index=true,同時如果主鍵不是‘index’,可以通過index_lable參數設定插入列

df.to_sql(TABLE, cn, index=True, index_label='id', if_exists='append')

使用models進行數據查詢

Django模型的數據查詢有get和filter等函數,能夠很方便的查找數據,但get和filter有本質區別,其中get每次返回一條數據,而且如果數據查詢不到,會拋出doesnoexist異常,需要對該異常進行捕獲,程序才能正常運行。而filter如果查詢不到,會返回一個空的dataset。

get異常捕獲

from django.core.exceptions import ObjectDoesNotExist  
  
try:
    checking = models.note_data.objects.filter(id=1)  
except ObjectDoesNotExist:
    return '不存在id爲1的數據'

        查詢語句如果有複雜查詢

get和filter函數沒有直接進行’與或非‘判斷等查詢方法,如果要進行’與或非‘操作,需要引入Q函數

from django.db.models import Q

Q函數的主要作用是:對對象進行復雜查詢,並支持&(and),|(or),~(not)操作符。

以不等判斷爲例

models.modelname.objects.filter(~Q(bonuslevel='未中獎'), phasenum=phase_num)

表示查找數據庫中所有bonuslevel不是”未中獎“的數據,注意如果只使用一個非~操作,則需要將該條件放置在最前面,後面再進行其他參數設置。

剛學到:非操作還可以這麼寫

models.modelname.objects.filter(sex='male').exclude(name='tom')

等價於下面

models.modelname.objects.filter(Q(sex='male') & ~Q(name='tom'))


 

        獲取最大值

如果是直接在數據庫拉取

from django.db.models import Max 
models.modelname.objects.all().aggregate(Max('id'))

如果是從已經存在的model列表獲取

from django.db.models import Max
args = models.modelname.objects.all() 
maxid = args.aggregate(Max('id'))

PS巨坑:此時返回的數據列名稱不再是id了,而是id__max,如果要獲取該值,則是maxid[id__max],注意是兩個下劃線加max。如有其他函數如求最小值,也是一樣的,導入該函數後,返回的列名加兩個下劃線後,id__min

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