ORM:關係對象映射。定義一個類自動生成數據庫的表結構。html
數據庫經常使用的數據類型 :python
ORM分爲兩種類型: 主流都是code firstmysql
Django也是code first。其本質:sql
2.根據類對數據庫中的表進行各類操做數據庫
1 from django.db import models 2 3 class UserInfo(models.Model): # 必須繼承models.Model 4 # 不寫則,django默認建立ID列,自增,主鍵 5 # 用戶名列,字符串類型,指定長度 6 username = models.CharField(max_length=32) 7 password = models.CharField(max_length=64)
執行命令python manage.py makemigrations
,會提示No changes detected
,django
這是由於:執行命令時會找全部models,可是django不知道找哪一個,全部須要指定一下。緩存
在配置文件setting中cookie
1 INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'app01', # 這裏添加app 9 ]
1 python manage.py makemigrations # 生成migrations臨時文件 2 python manage.py migrate # 根據migrations直接生成數據庫
執行後,從migrations便會產生操做記錄。生成數據庫,默認狀況下用的sqlite3。能夠用navicat等軟件直接打開。session
db.sqlite3裏面包含緩存、session、cookie、靜態文件以及後臺管理。像我們建立的表名叫:app01_userinfoapp
Django默認使用的是sqllite,若是想使用mysql數據庫。代碼不用改、命令也不用改,只須要改下配置文件。
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases 官網文檔 # DATABASES = { # sqlite 默認 # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES = { # mysql 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '3306', } }
注意:
1.Django在使用mysql的時候,不能幫咱們建立數據庫,因此咱們要本身去建立
2.Django默認使用MySQLdb模塊連接MySQL,可是在py3中尚未MySql模塊,因此咱們要使用PyMysql。
在project項目名下的__init__.py
裏面
1 import pymysql 2 pymysql.install_as_MySQLdb()
1 from cmdb import models #先到app中把models導入,下面可以使用咱們的類
2 def orm(request): 3 *****建立的三種方法,推薦使用第一種 4 # models.User_info.objects.create(username='aelex',password='123')
5 # dic = {'username':'lh','password':'231'}
6 # models.User_info.objects.create(**dic)
7 # obj = models.User_info(username='aelex',password='231')
8 # obj.save()
9 ***********基本的查數據:獲得的數據是一個對象結合 10 #v=models.User_info.objects.all() #獲得的是QuerySet對象,而且有多個元素,相似列表,能夠進行for循環
11 #v = models.User_info.objects.filter(id=1) #filter 至關於 sql中的where
12 # v = models.User_info.objects.filter(username='lh', password='231')# 使用,拼接and的做用
13 # for row in v:
14 # print(row.id, row.username, row.password) #每一個元素都是咱們在定義數據庫的時候的值
15 *******************刪除操做 16 # models.User_info.objects.filter(id=1).delete() #先獲得對象,在使用dellete方法刪除
17 ******************更新操做 18 models.User_info.objects.all().update(password='888') 19 return render(request, 'orm.html')
1 class host(models.Model): 2 #db_index 是建立索引,加快搜索 3 id = models.AutoField(primary_key=True) 4 hostname = models.CharField(max_length=32,db_index=True) 5 ip = models.GenericIPAddressField(db_index=True,protocol='both') 6 port = models.IntegerField() 7 b = models.ForeignKey('Busniess',to_field='id') 8 #b是一個對象,封裝了另一種表的一整行數據,這個表中並不存在b,只存在b_id 9 #視圖函數中操做b是一個鏈表操做。 10 11 class Application(models.Model): 12 name = models.CharField(max_length=21) 13 14 class HostToApp(models.Model): 15 hobj = models.ForeignKey(to="host", to_field="id") 16 aobj = models.ForeignKey(to="Application",to_field="id")
建立了一張新表,自動關聯二者的主鍵。
1 class host(models.Model): 2 #db_index 是建立索引,加快搜索 3 id = models.AutoField(primary_key=True) 4 hostname = models.CharField(max_length=32,db_index=True) 5 ip = models.GenericIPAddressField(db_index=True,protocol='both') 6 port = models.IntegerField() 7 b = models.ForeignKey('Busniess',to_field='id') 8 #b是一個對象,封裝了另一種表的一整行數據,這個表中並不存在b,只存在b_id 9 #視圖函數中操做b是一個鏈表操做。 10 11 class Application(models.Model): 12 name = models.CharField(max_length=21) 13 r = models.ManyToManyField(to="host")
手動建立:能夠自定義列,使用類操做數據庫來使用。
自動建立:只能建立三列(id,兩張表的主鍵)。看不到這個類,因此沒法直接對錶進行操做。
間接操做:
obj=models.Application.obj.get(id=1) #獲得一列,裏面有name與r(是一個對象) obj.r.add(1) obj.r.add(1,2,3) obj.r.add(*[1,2,3]) obj.r.remove(1) 存在上面三種方式 obj.r.clear() 狀況全部的對應 obj.r.set(1,2,3) 相似重置的功能,刪除全部的對應,新建1-1 1-2 1-3