小生博客:http://xsboke.blog.51cto.com
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括紫云網(wǎng)站建設(shè)、紫云網(wǎng)站制作、紫云網(wǎng)頁(yè)制作以及紫云網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,紫云網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到紫云省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!-------謝謝您的參考,如有疑問(wèn),歡迎交流
本次主要收集了在django中經(jīng)常使用到的配置.便于大家查詢(xún)
目錄:
一. 常用配置
漢化admin,時(shí)間格式化,指定statics.
漢化admin,指定時(shí)區(qū)
LANGUAGE_CODE = 'zh_Hans'
TIME_ZONE = 'Asia/Bangkok'
格式化時(shí)間顯示
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s'
DATE_FORMAT = 'Y-m-d'
指定static
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"statics"),
)
注冊(cè)models,自定義admin
from app.models import *
admin.site.site_header = '服務(wù)器續(xù)費(fèi)信息' # 此處設(shè)置頁(yè)面顯示標(biāo)題
admin.site.site_title = '服務(wù)器續(xù)費(fèi)信息' # 此處設(shè)置頁(yè)面頭部標(biāo)題@admin.register(TableName)
class TNAdmin(admin.ModelAdmin):
fields = ('issue','start_date','applicant','result','receiver','end_date','memo') # 設(shè)置編輯界面顯示的字段
list_display = ('number','issue','start_date','applicant','result','receiver','end_date') # 設(shè)置在列表中顯示的字段
search_fields = ('start_date',) #增加一個(gè)搜索欄
empty_value_display = '未填寫(xiě)' # 覆蓋空字段為短劃線
list_per_page = 50 # 每頁(yè)顯示的行數(shù)
ordering = ('-number',) # 設(shè)置默認(rèn)排序字段,-為降序
list_editable = ['result',] # 設(shè)置可編輯字段
list_display_links = ('id', 'caption') # 設(shè)置哪些字段可以點(diǎn)擊進(jìn)入編輯界面
date_hierarchy = 'start_date' # 詳細(xì)時(shí)間分層篩選
list_filter = ('start_date','end_date','receiver','result') # 過(guò)濾器
初始化models,創(chuàng)建超級(jí)用戶.
python manage.py makemigrations
python manage.py migratepython manage.py createsuperuser
什么是ORM
ORM,對(duì)象關(guān)系映射,是一個(gè)對(duì)應(yīng)關(guān)系,用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類(lèi)型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換,換言之,就是用面向?qū)ο蟮姆绞饺ゲ僮鲾?shù)據(jù)庫(kù)的創(chuàng)建表以及增刪改查等操作。
優(yōu)點(diǎn):
1.1 ORM使得我們的通用數(shù)據(jù)庫(kù)交互變得簡(jiǎn)單易行,而且完全不用考慮該死的SQL語(yǔ)句,快速開(kāi)發(fā),由此而來(lái)
1.2 可以避免一些新手程序要寫(xiě)sql語(yǔ)句帶來(lái)的性能問(wèn)題缺點(diǎn):
1.3 性能有所犧牲,不過(guò)現(xiàn)在的各種ORM框架都在嘗試各種方法,比如緩存,延遲加載等來(lái)減輕這個(gè)問(wèn)題
1.4 對(duì)于個(gè)別復(fù)雜查詢(xún),ORM仍力不從心,為了解決這個(gè)問(wèn)題,ORM一般也支持寫(xiě)raw sql。
二. ORM的使用
2.1 創(chuàng)建表
創(chuàng)建單表
創(chuàng)建關(guān)聯(lián)表:foreignkey(通過(guò)外鍵關(guān)聯(lián))
表之間的關(guān)系:
一對(duì)一
一對(duì)多
多對(duì)多
2.2 創(chuàng)建單表
# 表創(chuàng)建完之后需要生成,執(zhí)行兩條命令
# python manage.py makemigrations
# python manage.py migrate
from django.db import models
class 表名(models.Model):
字段名 = models.字段屬性(屬性值)
def __str__(self): # 防止打印對(duì)象時(shí),輸出內(nèi)存地址
return self.<要打印的變量>
字段屬性:
字段名 = models.CharField(max_length=64)
CharField :較短的字符串
IntegerField :數(shù)字
ForeignKey :
ManyToManyField :
2.2.1 單表的增,建議使用create第二種
create方式一:
表名.object.create(
字段1=要插入的數(shù)據(jù)1,
字段2=要插入的數(shù)據(jù)2,
字段3=要插入的數(shù)據(jù)3,
)
create方法二:以字典的方式插入
表名.object.create(**{"字段1":"數(shù)據(jù)1"})
save方法一:
變量=表名(字段1="數(shù)據(jù)1")
變量.save()
save方法二:
變量=表名()
變量.字段="數(shù)據(jù)1"
變量.save()
2.2.3 單表的刪除
表名.objects.filter(條件).deleter()
2.2.3 單表的修改
update方法:filter調(diào)用的是一個(gè)集合,效率比save高
表名.objects.filter(條件1,條件2).update(字段=數(shù)據(jù))
save方法(相當(dāng)于重新賦值):get調(diào)用的是一個(gè)對(duì)象
變量 = 表名.objects.get(條件)
變量.字段=數(shù)據(jù)
變量.save()
2.2.4 單表的查詢(xún)
<1>查數(shù)據(jù)
變量 = models.表名.objects.filter(id=2)[0] # 取出過(guò)濾出id=2的,第一行
filter(**kwargs) :包含與所給篩選條件相匹配的對(duì)象
all() :查詢(xún)所有結(jié)果
變量 = models.表名.objects.filter(id=2).values("字段")
# 返回一個(gè)列表,列表中包含字典,字典里面存放的是"字段:數(shù)據(jù)"
# [{"字段1":"數(shù)據(jù)1"},{"字段2":"數(shù)據(jù)2"}]
<2>查到數(shù)據(jù)后的操作,在.filter和.all的后面
exclude(**kwargs) :包含與所給篩選條件不匹配的對(duì)象
order_by(*field) :對(duì)查詢(xún)結(jié)果排序
# 正序: 變量 = models.表名.objects.order_by("id")
# 倒序: 變量 = models.表名.objects.order_by("-id")
reverse() :對(duì)查詢(xún)結(jié)果反向排序
distinct() :從返回結(jié)果中剔除重復(fù)記錄
values_list(*field) :與values()相似,返回一個(gè)元組序列
count() :返回?cái)?shù)據(jù)庫(kù)中匹配查詢(xún)的對(duì)象數(shù)量
first() :返回第一條記錄
last() :返回最后一條記錄
exists() :如果QuerySet包含數(shù)據(jù),就返回True,否則返回False
惰性機(jī)制:
表名.objects.all()或者.filter()等都只是返回一個(gè)QuerySet(查詢(xún)結(jié)果集對(duì)象),
它并不會(huì)馬上執(zhí)行sql,而是當(dāng)調(diào)用QuerySet的時(shí)候才執(zhí)行。
QuerySet特點(diǎn):
1. 可迭代
2. 可切片
objs = models.表名.objects.all()
#迭代
for obj in objs:
print("obj:",obj)
#切片
print(objs[1])
print(objs[1:4])
print(objs[::-1])
3. 多表
3.1 一對(duì)多(ForeignKey),比如 表1:"出版社" 和 表2:"書(shū)",一個(gè)出版社可以出多本書(shū),外鍵要放在多里面
class 出版社表(models.Model):
出版社名 = models.CharField(max_length=30)
出版社地址 = models.CharField(max_length=30)
class 書(shū)表(models.Model):
書(shū)名 = models.CharField(max_length=30)
出版社 = models.ForeignKey("出版社表")
# 對(duì)于外鍵,F(xiàn)oreignKey,在數(shù)據(jù)庫(kù)中,Django會(huì)自動(dòng)將字段存為"出版社_id"
# 當(dāng)有外鍵時(shí)需要插入數(shù)據(jù),寫(xiě)為
# 第一種插入方式
書(shū)表.objects.create (
書(shū)名 = "魯濱遜流浪記"
出版社_id = "1" // 直接插入
)
# 第二種插入方式
pub = models.出版社表.objects.filter(id=1) # 首先實(shí)例化一個(gè)對(duì)象
書(shū)表.objects.create (
書(shū)名 = "魯濱遜流浪記"
出版社 = pub[0] # 然后插入
)
3.2 多對(duì)多(ManyToManyField)
比如作者和書(shū),一個(gè)作者可以寫(xiě)作本書(shū),一本書(shū)可以由多個(gè)作者完成,這時(shí)候外鍵放哪都行
class 書(shū)表(models.Model):
書(shū)名 = models.CharField(max_length=30)
作者 = models.ManyToManyField("作者表") # 自動(dòng)創(chuàng)建第三張表
class 作者表(models.Model):
作者名 = models.CharField(max_length=64)
這時(shí)候會(huì)產(chǎn)生一個(gè)表,結(jié)構(gòu)為:
id 書(shū)表_id 作者表_id
1 5 4
2 5 1
3 5 2
4 6 1
5 6 1
插入數(shù)據(jù)的方法:
# 給一本書(shū)添加兩個(gè)作者
作者1 = models.作者表.objects.get(id=3)
作者1 = models.作者表.objects.get(id=4)
書(shū)表 = models.書(shū)表.objects.filter(id=3)[0]
# 一下三種方式都可
書(shū)表.作者.add(作者1,作者2)
書(shū)表.作者.add(作者1)
書(shū)表.作者.add(作者2)
書(shū)表.作者.add(*[作者1,作者2])
執(zhí)行完之后。映射表的內(nèi)容為:
id 書(shū)表_id 作者表_id
1 3 3
2 3 4
第三張表可以自己創(chuàng)建:
class 書(shū)表(models.Model):
書(shū)名 = models.CharField(max_length=30)
作者 = models.ManyToManyField("作者表") # 自動(dòng)創(chuàng)建第三張表
class 作者表(models.Model):
作者名 = models.CharField(max_length=64)
class 第三張表(models.Model):
書(shū) = models.ForeignKey(書(shū)表)
作者 = models.ForeignKey(作者表)
class Meta: # 定義表的相關(guān)屬性
unique_together=["書(shū)","作者"] # 聯(lián)合唯一,根據(jù)需求定義
id 書(shū)_id 作者_(dá)id
1 3 3 # 為了避免這種情況出現(xiàn),表在創(chuàng)建的時(shí)候要做一個(gè)聯(lián)合唯一的屬性
2 3 3 # 為了避免這種情況出現(xiàn),表在創(chuàng)建的時(shí)候要做一個(gè)聯(lián)合唯一的屬性
3 3 4
3.3 一對(duì)一
OneToOne:一個(gè)通過(guò)兩個(gè)Foreignkey,unqiue=True
4. 查詢(xún)
4.1 對(duì)象查詢(xún)
通過(guò)將查詢(xún)到的數(shù)據(jù)賦予給一個(gè)變量,這就叫對(duì)象查詢(xún)
4.1.1 正向查找
# 需求:找到書(shū)所在出版社的城市,其中書(shū)是一個(gè)表,出版社是一個(gè)表,出版社里面包括城市
# 其中,書(shū)表外鍵到了出版社表
obj = models.書(shū)表.objects.filter(書(shū)名="魯濱遜流浪記")[0]
obj.外鍵.城市 # 可以通過(guò)外鍵,調(diào)用另一個(gè)表的字段
4.1.2 反向查找
# 現(xiàn)在有一個(gè)出版社表,一個(gè)書(shū)表,外鍵在書(shū)表
# 現(xiàn)在需要將某個(gè)出版社出版的所有的書(shū)輸出
obj = models.出版社表.objects.filter(name="人民出版社")
obj.書(shū)表_set.all().values("書(shū)名") # 通過(guò) "表名_set" 這種格式反向查找
4.2 雙下劃線之單表?xiàng)l件查詢(xún)
models.表1.objects.filter(id__lt=10,id__gt=1) # 獲取id大于1且小于10的值
models.表1.objects.filter(id__in=[11,22,33]) # 獲取id等于11/22/33的數(shù)據(jù)
models.表1.objects.exclude(id_in=[11,22,33]) # 不等于
models.表1.objects.filter(name__contains="ven") # 與sql的模糊查詢(xún)類(lèi)似
models.表1.objects.filter(name__icontains="ven") # icontains大小寫(xiě)不敏感
models.表1.objects.filter(id__range=[1,2]) # 范圍,bettwen and
startswith(以什么開(kāi)頭)、istartwith、endswith(以什么結(jié)尾)、iendwith
4.3 雙下劃線之關(guān)聯(lián)表查詢(xún)
# 把所有書(shū)名叫魯濱遜流浪記的出版社打印
models.出版社表.objects.filter(書(shū)表__書(shū)名="魯濱遜流浪記").vaules("出版社名").distinct()
# 打印人民出版社出版的書(shū)
models.書(shū)表.objects.filter(出版社表__出版社名="人民出版社").values("書(shū)名")
# 打印出,出版魯濱遜流浪記的出版社
models.書(shū)表.objects.filter(書(shū)表__書(shū)名="魯濱遜流浪記").values("外鍵__出版社名")
4.4 聚合查詢(xún)和分組查詢(xún),是一種聚合函數(shù)
from django.db.models import Avg,Min,Sum,Max
Avg,Min,Sum,Max 是聚合方法
<1> 聚合查詢(xún)
在最后查詢(xún)的結(jié)果集上進(jìn)行操作,只有一個(gè)結(jié)果
aggregate(*args,**kwargs)
# 作者wangyi發(fā)表的書(shū)價(jià)格的一個(gè)平均值
書(shū)表.objects.all().aggregate(Avg('價(jià)格'))
<2> 分組查詢(xún)
先根據(jù)條件把所有的結(jié)果進(jìn)行一個(gè)分組,然后對(duì)每一個(gè)結(jié)果進(jìn)行操作
annotate(*args,**kwargs)
# 查詢(xún)每一個(gè)作者出的書(shū)價(jià)格的總價(jià)格
書(shū)表.objects.values("作者表__作者名").annotate(Sum("price"))
4.5 F查詢(xún)和Q查詢(xún)
4.5.1 F 查詢(xún),使用查詢(xún)條件的值,專(zhuān)門(mén)取對(duì)象中某列值的操作
from django.db.models import F,Q
# 給每本書(shū)增加20塊錢(qián)
models.書(shū)表.objects.all().update(價(jià)格=F('價(jià)格')+20) # 只支持?jǐn)?shù)字
4.5.2 Q 查詢(xún),用于封裝關(guān)鍵字查詢(xún)
之前的查詢(xún)都是單關(guān)鍵字查詢(xún),也有用過(guò)雙關(guān)鍵字,但是是用逗號(hào)分隔,代表and;
可是如果我想用或呢,或者我想用or里面包括and,例如: a and (b or (d and e))
from django.db.models import F,Q
如果這樣寫(xiě),這兩個(gè)語(yǔ)句的結(jié)果都是一樣的:
obj = models.書(shū)表.objects.filter(id=3)[0]
obj = models.書(shū)表.objects.filter(Q(id=3))[0]
示例Q查詢(xún)的多關(guān)鍵字查詢(xún)
obj = models.書(shū)表.objects.filter( Q(id=3) | Q(書(shū)名="魯濱遜流浪記") ) # 使用管道符"|"實(shí)現(xiàn)or方法
obj = models.書(shū)表.objects.filter( Q(價(jià)格__gt=50) & (Q(id=3) | Q(書(shū)名="魯濱遜流浪記")) ) # 價(jià)格大于50并且(id=3或者書(shū)名=魯濱遜流浪記的書(shū))
obj = models.書(shū)表.objects.filter( Q(價(jià)格__gt=50) & (Q(id=3) | Q(書(shū)名="魯濱遜流浪記")) , 顏色="紅色" ) # 用普通查詢(xún)加Q查詢(xún),普通查詢(xún)必須放在Q查詢(xún)后面(查詢(xún)(價(jià)格大于50并且(id=3或者書(shū)名=魯濱遜流浪記)并且顏色為紅色的書(shū))
5. 注意,創(chuàng)建表的時(shí)候,為了防止返回內(nèi)存參數(shù),建議寫(xiě)為如下樣式
class 書(shū)表(models.Model):
書(shū)名 = models.CharField(max_length=30)
作者 = models.ManyToManyField("作者表")
def __str__(self)
return self.書(shū)名 # 將需要返回的數(shù)據(jù)使用str方法返回
創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。