設置字段爲空
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