django爲咱們集成了ORM對數據庫進行操做,咱們只須要進行定義model,django就會自動爲咱們建立表,以及表之間的關聯關係html
建立好一個django項目-首先在setting.py中配置你要使用的數據前端
1.再settings.py中添加你的app #django自帶的是sqlite3 #下面是自帶的django 數據庫設置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
若是要想要使用mysql做爲你的數據庫python
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'庫名稱', 'USER': '用戶名', 'PASSWORD': '密碼', 'HOST': '主機地址', 'PORT': '端口', } }
django關於數據庫部分:https://docs.djangoproject.com/en/1.10/ref/settings/#databasesmysql
在python3.x中鏈接mysql - MySqlDB (python2.x) - pymysql (python3.x) 在settings配置目錄的init.py中: import pymysql pymysql.install_as_MySQLdb()
1.定義表結構---建立一個類sql
類 --> 數據庫的表 字段 --> 列 對象 --> 一行數據 from django.db import models class UserInfo(models.Model): #設置自增加主鍵-若是不設置默認django會生成id列 爲主鍵 nid = models.AutoField(primary_key=True) #定義爲字符,最大長度爲32 username = models.CharField(max_length=32) pwd = models.CharField(max_length=64) #定義爲數字類型, age = models.IntegerField()
經常使用的model中的類型數據庫
models.CharField #字符類型 models.TextField #文本框類型 models.IntegerField #整型 models.BooleanField #布爾型 models.AutoField #自動增加 models.DateTimeField #時間 models.DateField #日期 models.EmailField #郵箱 models.IPAddressField #IP地址 models.ImageField #圖片 models.FileField #文件 models.FilePathField #文件路徑 models.URLField #URL類型
2.當咱們設計完表結構之後,根據app的models.py生成數據庫表django
--執行下面的命令在數據庫中生成對應的表 python manage.py makemigrations python manage.py migrate
3.數據庫基本操做python3.x
當咱們在view視圖函數中須要處理數據的時候,app
注意:model裏定義的大寫-在調用的時候都是小寫 a. 查 models.userinfo.objects.all() #獲取表中全部的數據tb(表) models.userinfo.objects.filter(nid=1) models.userinfo.objects.filter(nid=1).first() #若是不存在會返回None models.userinfo.objects.values() #返回一個字典格式的 models.userinfo.objects.value_list() #返回一個列表格式 b. 增 models.userinfo.objects.create(...) #添加數據的方式一 obj = models.userinfo(...) #添加數據方式二 obj.save() c. 刪 models.userinfo.objects.all().delete() #刪除全部的數據 models.userinfo.objects.filter(nid=1).delete() #刪除nid=1的數據 d. 改 models.userinfo.objects.all().update(...) #更新全部的數據 models.userinfo.objects.filter(nid=1).update(...) #更新nid=1的數據
咱們先作一個準備工做函數
# 1.建立表 #定義一個部分表 class DePart(models.Model): title = models.CharField(max_length=16) #用戶表 class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=64) #用戶是屬於某一個部分的-是一對多的關係(一個部門對應多個用戶) dp = models.ForeignKey(to="DePart",to_field="id",null=True,on_delete=models.SET_NULL) #用戶是能夠屬於多個用戶組-是多對多的關係(一個用戶可對應多個組,一個組裏也能夠有多個用戶) 這個manytomany 也能夠放到用戶組中 -自動建立表(userinfo_gp) gp = models.ManyToManyField('group') #用戶組表 class Group(models.Model): groupname = models.CharField(max_length=32)
咱們來講一下表之間的關聯關係
- 一對多關係(ForeignKey) 經過對to='表名' to_field='要關聯表的字段'設置進行一對多的關係 - 多對多關係(ManyToManyField) 一種是用django自帶的ManytoManyField,會自動建立一張userinfo_gp表(id,foreinkey,foreinkey)-維護對應關係 一張是本身建立一個表進行維護,好處是列的數量能夠本身定義 - 一對一關係(OneToOneField) #經過view.py文件,建立對應的數據 views: def test(request): models.DePart.objects.create(title='IT') models.DePart.objects.create(title='諮詢') models.DePart.objects.create(title='公關') models.UserInfo.objects.create(username='alex',password='123',dp_id=1) models.UserInfo.objects.create(username='eric',password='123',dp_id=1)
(正向)跨表操做: 由包含ForeignKey的表查詢另外一張表的內容,獲取外鍵關聯表的內容
格式:
obj.表名_列名
# 1.獲取對象 跨表查詢1 # 經過all獲取到的是一個列表形式[obj,obj,obj] # q=models.UserInfo.objects.all() # for row in q: # print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp) # 2. 字典 跨表查詢2 # 經過values獲取到的是一個字典形式 # q=models.UserInfo.objects.values('username','password','dp_id','dp__title') # for row in q: # print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp) # 3.元組 跨表查詢3 # 經過value_list獲取到一個列表-元組的格式[(),(),()] # q=models.UserInfo.objects.values_list('username','password','dp_id','dp__title') # for row in q: # print(row) # print(row[0],row[3])
(反向)跨表 ,自己表內沒有外鍵存在...但對方表中使用了該表作外鍵
格式
若是正向的表中設置了related_name=‘xxx’
obj.xxx_set.列名
#兩種操做類型,userinfo_set 和 userinfo__ #1.對象 # v=models.DePart.objects.all() # for row in v: # print(row.id,row.title,row.userinfo_set.all()) #2.字典 # v=models.DePart.objects.values('id','title','userinfo__password','userinfo__password') # for row in v: # print(row) #3.元組 # v=models.DePart.objects.values_list('id','title','userinfo__username','userinfo__password') # for row in v: # print(row)
2.多對多查詢 ---ManyToManyField---
經過ORM根據ManyToManyField字段生成的表進行操做
userinfo_obj=models.UserInfo.objects.filter(id=1).first() #查找用戶ID爲1的數據 # 1.添加數據的方式 # userinfo_obj.m.add(1) #添加用戶ID爲1,組ID爲1 的 # userinfo_obj.m.add(2,3,4) #添加用戶ID爲1,組ID爲2,3,4 的 # userinfo_obj.m.add(*[1,2]) # 2.刪除數據的方式 # userinfo_obj.m.remove(1) # userinfo_obj.m.remove(2,3) # userinfo_obj.m.remove(*[1,]) # 3.清除數據 # userinfo_obj.m.clear() #清楚用戶ID爲1 的全部組數據 #至關於更新操做,將全部的數據清除,再添加1,2 # userinfo_obj.gp.set([1,2,]) # q=userinfo_obj.gp.all() #獲取用戶組的信息 # print(q) #創建在上一次查詢基礎上,再次作二次篩選 q = userinfo_obj.gp.filter(id__gt=1) print(q) return HttpResponse('123') 前端展現:
關於ManyToMany字段:
操做: 表設計 class Ip(models.Model): '''全部IP地址''' ip = models.GenericIPAddressField(null=True) item = models.ForeignKey('Item') platform = models.ForeignKey('Platform',null=False) m_port = models.ManyToManyField('Port') class Port(models.Model): port = models.IntegerField() comment = models.CharField(max_length=64,null=True,blank=True) def __str__(self): return str(self.port) views: all_ip = models.Ip.objects.all() # for i in all_ip: # print(i.m_port.all()) return render(request, 'ip_list.html',locals()) 前端展現: {% for ip_obj in all_ip %} <td>{% for port in ip_obj.m_port.all %}{{ port.port }},{% endfor %}</td> {% endfor %}
後續增長ORM操做內容
ORM 建立表
FK經常使用操做
class A(Model): name = models.CharField(....) class B(Model): name = models.Charfild(...) fk = models.FK(A)
B表中有幾列
id name fk_id
a.跨表操做
b_list = models.B.objects.all() for item in b_list: item.id item.name item.fk_id item.fk item.fk.name item.k.id
b.跨表操做
b_list = models.B.objects.values("id","name","fk_id","fk__name") for item in b_list: item["id"] item["name"] item["fk_id"] item["fk__name"]
c.跨表操做
b_list = models.B.objects.value_list("id","name","fk_id","fk__name") for item in b_list: item[0] item[1] item[2] item[3]
d.跨表操做
models.B.objects.filter(fk__name="李鵬飛")
M2M 經常使用操做
class A(Model): name = models.CharField(....) class B(Model): name = models.Charfild(...) m = models.M2M(A)
a. B表中有幾列
id
name
PS: 自動生成一個第三張表:m 用於間接的對第三張表進行操做
b. 在B表中插入三條數據: A表中插入2條數據
models.A.objects.create(name="張")
models.A.objects.create(name="三")
models.A.objects.create(name="豐")
models.B.objects.create(name="興普") models.B.objects.create(name="香香") models.B.objects.create(name="皮皮")
c. 興普和【張,三,豐】建立關係
obj = models.B.objects.create(name="興普") obj.m.add(1) obj.m.add(2) obj.m.add(*[1,2,3])
d. 查找和興普有關係的人?
obj = models.B.objects.create(name="興普") obj.m.all() [A-obj,A-obj]