Python的WEB框架有Django、Tornado、Flask 等多種,Django相較與其餘WEB框架其優點爲:大而全,框架自己集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。python
1、建立django程序mysql
終端命令:django-admin startproject sitenamegit
IDE 建立Django程序時,本質上都是自動執行上述命令正則表達式
其餘經常使用命令:sql
python manage.py runserver 0.0.0.0數據庫
python manage.py startapp appname django
python manage.py syncdb緩存
python manage.py makemigrationsapp
python manage.py migrate框架
python manage.py createsuperuser
二,程序目錄
3、配置文件
一、數據庫
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
# 因爲Django內部鏈接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,因此須要使用pymysql來代替 # 以下設置放置的與project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
二、模版
TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), )
三、靜態文件
STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
到目前爲止,當咱們的程序涉及到數據庫相關操做時,咱們通常都會這麼搞:
import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchall() db.close() return data def GetSingle(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchone() db.close() return data
django爲使用一種新的方式,即:關係對象映射(Object Relational Mapping,簡稱ORM)。
PHP:activerecord
Java:Hibernate
C#:Entity Framework
django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。
1、建立表
一、基本結構
from django.db import models class userinfo(models.Model): name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField()
一、models.AutoField 自增列 = int(11) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。 2、models.CharField 字符串字段 必須 max_length 參數 三、models.BooleanField 布爾類型=tinyint(1) 不能爲空,Blank=True 四、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 繼承CharField,因此必須 max_lenght 參數 5、models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 6、models.DateTimeField 日期類型 datetime 同DateField的參數 七、models.Decimal 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places 八、models.EmailField 字符串類型(正則表達式郵箱) =varchar 對字符串進行正則表達式 九、models.FloatField 浮點類型 = double 10、models.IntegerField 整形 11、models.BigIntegerField 長整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 12、models.IPAddressField 字符串類型(ip4正則表達式) 13、models.GenericIPAddressField 字符串類型(ip4和ip6是可選的) 參數protocol能夠是:both、ipv四、ipv6 驗證時,會根據設置報錯 14、models.NullBooleanField 容許爲空的布爾類型 15、models.PositiveIntegerFiel 正Integer 16、models.PositiveSmallIntegerField 正smallInteger 17、models.SlugField 減號、下劃線、字母、數字 18、models.SmallIntegerField 數字 數據庫中的字段有:tinyint、smallint、int、bigint 1九、models.TextField 字符串=longtext 20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]] 21、models.URLField 字符串,地址正則表達式 22、models.BinaryField 二進制 23、models.ImageField 圖片 2四、models.FilePathField 文件
一、null=True 數據庫中字段是否能夠爲空 二、blank=True django的 Admin 中添加數據時是否可容許空值 三、primary_key = False 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列 4、auto_now 和 auto_now_add auto_now 自動建立---不管添加或修改,都是當前操做的時間 auto_now_add 自動建立---永遠是建立時的時間 5、choices GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 6、max_length 7、default 默認值 8、verbose_name Admin中字段的顯示名稱 九、name|db_column 數據庫中的字段名稱 十、unique=True 不容許重複 十一、db_index = True 數據庫索引 十二、editable=True 在Admin裏是否可編輯 1三、error_messages=None 錯誤提示 1四、auto_created=False 自動建立 15、help_text 在Admin中提示幫助信息 1六、validators=[] 1七、upload-to
應用場景:
一對多:當一張表中建立一行數據時,有一個單選的下拉框(能夠被重複選擇)
例如:建立用戶信息時候,須要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中建立一行數據是,有一個能夠多選的下拉框
例如:建立用戶信息,須要爲用戶指定多個愛好
一對一:在某表中建立一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了
例如:原有含10列數據的一張表保存相關信息,通過一段時間以後,10列沒法知足需求,須要爲原來的表再添加5列數據
2、操做表
一、基本操做
# 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增長一條數據,能夠接受字典類型數據 **kwargs # obj = models.Tb1(c1='xx', c2='oo') # obj.save() # 查 # # models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) # models.Tb1.objects.all() # 獲取所有 # models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 # 刪 # # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據 # 改 # models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs # obj = models.Tb1.objects.get(id=1) # obj.c1 = '111' # obj.save() # 修改單條數據
二、進階操做(了不得的雙下劃線)
利用雙下劃線將字段和對應的操做鏈接起來
# 獲取個數 # # models.Tb1.objects.filter(name='seven').count() # 大於,小於 # # models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值 # models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於十一、2二、33的數據 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 範圍bettwen and # 其餘相似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc # limit 、offset # # models.Tb1.objects.all()[10:20] # group by from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
三、連表操做(了不得的雙下劃線)
利用雙下劃線和 _set 將表之間的操做鏈接起來
from django.db import models # Create your models here. class UserInfo(models.Model): user = models.CharField(max_length=32) email = models.EmailField(max_length=32) pwd = models.CharField(max_length=64) user_type = models.ForeignKey('UserType') class UserType(models.Model): nid = models.AutoField(primary_key=True) caption = models.CharField(max_length=16) class Host(models.Model): hid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32) ip = models.CharField(max_length=32) class Group(models.Model): gid = models.AutoField(primary_key=True) name = models.CharField(max_length=16) h2g = models.ManyToManyField('Host')
# 三種建立數據方法 # obj = models.Usertype(caption ='管理員' ) # obj.save() # # models.Usertype.objects.create(caption='普通用戶') # # obj = { # 'caption':'Guest' # } # models.Usertype.objects.create(**obj) # 建議使用這一種方法 # userinfo_dict = { # 'user':'張巖林', # 'email':'123@qq.com', # 'pwd':'123', # 'user_type_id':1, # } # userinfo_dicts = { # 'user':'aylin', # 'email':'124@qq.com', # 'pwd':'1333', # 'user_type':models.Usertype.objects.get(uid=3), # } # models.Userinfo.objects.create(**userinfo_dict) # models.Userinfo.objects.create(**userinfo_dicts)
# 單表查詢,查詢結果是queryset對象 # ret = models.Usertype.objects.all() # print(ret) # 結果<QuerySet [<Usertype: Usertype object>, <Usertype: Usertype object>, <Usertype: Usertype object>]> # for item in ret: # print(item.caption) # 取值管理員,普通用戶,guest # 單獨只取一列 vlaues # ret = models.Usertype.objects.all().values('caption') # print(ret) # for i in ret: # print(i,type(i)) # {'caption': '管理員'} <class 'dict'> # 能夠經過變量取到關聯表的對象後面加入.caption取另外一個表的內容 # ret = models.Userinfo.objects.all() # print(ret,type(ret)) # for item in ret: # print(item.user,item.user_type.caption) # item.user_type取到的是usertype的對象,因此能夠取caption # 連表查詢之雙下劃線 # ret = models.Userinfo.objects.all().values('user','user_type__caption') # print(ret) # 過濾全部用戶類型是管理員的用戶(連表查詢) # ret = models.Userinfo.objects.filter(user_type__caption="管理員").values('user', 'user_type__caption') # print(ret) # 反向查找_set # 過濾取出第一個是管理員的哪一行數據 # obj = models.Usertype.objects.filter(caption='管理員').first() # print(obj.uid) # print(obj.caption) # print(obj.userinfo_set.all()) # obj = models.Usertype.objects.filter(userinfo__user='張巖林').values('userinfo__user') # print(obj)
# 多對多操做 # 添加數據 # models.Host.objects.create(hostname='c1', ip='1.1.1.1') # models.Host.objects.create(hostname='c2', ip='1.1.1.2') # models.Host.objects.create(hostname='c3', ip='1.1.1.3') # models.Host.objects.create(hostname='c4', ip='1.1.1.4') # models.Host.objects.create(hostname='c5', ip='1.1.1.5') # # models.Group.objects.create(name='財務部') # models.Group.objects.create(name='人事部') # models.Group.objects.create(name='公關部') # models.Group.objects.create(name='技術部') # models.Group.objects.create(name='運營部') # models.Group.objects.create(name='銷售部') # models.Group.objects.create(name='客服部') # 將多臺機器,分配給一組【財務部】 # obj = models.Group.objects.get(gid=1) # obj.h2g.add(*models.Host.objects.all()) # print(obj.h2g.all()) # <QuerySet [<Host: Host object>, <Host: Host object>, <Host: Host object>, <Host: Host object>, <Host: Host object>]> # 將一臺機器,分配給多個組 # 方法一 只能一個一個添加 # host = models.Host.objects.get(hid=1) # group = models.Group.objects.get(gid=4) # group.h2g.add(host) # 方法二 添加多條 # h = models.Host.objects.get(hid=4) # h.group_set.add(*models.Group.objects.filter(gid__gt=3)) # 方法三 # h =models.Host.objects.get(hid=2) # ret = h.group_set.set(models.Group.objects.filter(gid__gt=3)) # print(ret,type(ret)) # 刪除語句 # h = models.Host.objects.get(hid=2) # h.group_set.remove(*models.Group.objects.filter(gid__gt=3)) # 危險刪除方法,慎用,會把分組表裏的分組也會給刪掉 # h.group_set.all().delete() # 補充,add添加能夠添加數字 # h = models.Host.objects.get(hid=1) # h.group_set.add(1) # h.group_set.add(models.Group.objects.get(gid=1)) # h.group_set.add(*[2,3]) # h.group_set.add(*models.Group.objects.filter(gid__gt=1)) # 兩個表都添加數據 # h = models.Host.objects.get(hid=2) # h.group_set.get_or_create(name = "人事部") # h.group_set.update_or_create(name="技術部") return HttpResponse("OK")
# h = models.Host.objects.get(hid=1) #models.Host.objects.filter(hid__gt=5).delete() #會刪除關係表的 也會刪除原始表的 # h.group_set.all().delete() # 只刪除關係表中的數據 # h.group_set.remove(*models.Group.objects.filter(gid__gt=2)) # 修改 set 不能作修改 若是有就保留 刪除其餘 # h.group_set.set(models.Group.objects.filter(gid=8)) # 修改 set 若是有就保留 沒有就添加 # h.group_set.set(models.Group.objects.filter(gid__gt=2)) # clear 默認是false 來行數據添加 clear=True 先清除後添加新數據 #h.group_set.set(models.Group.objects.filter(gid=2),clear=True) # models.Group.objects.filter(gid__gt=5).delete() # h = models.Host.objects.get(hid=1) #關係表裏面存在無論,若是不存在兩個都加 # h.group_set.update_or_create(name='人事部') #關係表裏面存在無論,若是不存在兩個都加 # h.group_set.get_or_create(name='人事部')
注意:xx_set中的【_set】是多對多中的固定搭配
擴展: