Django(三) ORM操做

1、DjangoORM 建立基本類型及生成數據庫表結構

一、簡介

  ORM:關係對象映射。定義一個類自動生成數據庫的表結構。html

  數據庫經常使用的數據類型 :python

    1. 數字
    2. 字符串
    3. 時間

       ORM分爲兩種類型: 主流都是code firstmysql

    • code first:先寫代碼,執行代碼建立數據庫表結構
    • DB    first:據庫裏先建立數據庫表結構,根據表結構生成類,根據類操做數據庫

  Django也是code first。其本質:sql

    1. 根據類自動建立數據庫表

      2.根據類對數據庫中的表進行各類操做數據庫

二、建立數據庫 表結構

  2.1 先寫類

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)

 

  2.2 註冊app

    

   執行命令python manage.py makemigrations,會提示No changes detecteddjango

      這是由於:執行命令時會找全部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 ]

  2.3執行命令生成表結構

1 python manage.py  makemigrations    # 生成migrations臨時文件
2 python manage.py  migrate           # 根據migrations直接生成數據庫

  執行後,從migrations便會產生操做記錄。生成數據庫,默認狀況下用的sqlite3。能夠用navicat等軟件直接打開。session

  db.sqlite3裏面包含緩存、session、cookie、靜態文件以及後臺管理。像我們建立的表名叫:app01_userinfoapp

  2.四、鏈接mysql數據庫

    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()

 2、Django ORM基本的增刪改查

 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:手動建立

 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")

方式2:系統自動建立

建立了一張新表,自動關聯二者的主鍵。

 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
相關文章
相關標籤/搜索