1. 程式人生 > >Django入門4: ORM 數據庫操作

Django入門4: ORM 數據庫操作

content ins migration rst 小數類型 tro edi .py 根據

大綱

一、DjangoORM 創建基本類型及生成數據庫表結構
1、簡介
2、創建數據庫 表結構
二、Django ORM基本增刪改查
1、表數據增刪改查
2、表結構修改
三、Django ORM 字段類型
1、字段類型介紹
2、字段參數介紹
3、Django ORM 外鍵操作

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

1、簡介

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

創建數據庫的時候,一般有以下幾種常用數據類型:數字、字符串以及時間。

ORM分為兩種:

  • DB First 數據庫裏先創建數據庫表結構,根據表結構生成類,根據類操作數據庫
  • Code First 先寫代碼,執行代碼創建數據庫表結構

主流的orm都是code first。django 的orm也是code first,所以學的時候,本質就分為兩塊:

  • 根據類自動創建數據庫表
  • 根據類對數據庫表中的數據進行各種操作

2、創建數據庫 表結構

  • 先寫類:

app下models.py文件:

技術分享
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)
View Code
  • 註冊APP

執行命令python manage.py makemigrations,會提示No changes detected,這是因為:執行命令時會找所有models,但是django不知道找哪個,所有需要指定一下。

settings.py:

技術分享
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 ]
View Code
  • 執行命令生成表結構

  1 python manage.py makemigrations # 生成migrations臨時文件

    2 python manage.py migrate # 根據migrations直接生成數據庫

  執行後,從migrations便會產生操作記錄。生成數據庫,默認情況下用的sqlite3。可以用navicat等軟件直接打開。

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

  • 連接mysql數據庫

如果不使用sqlite,使用mysql數據庫。代碼不用改、命令也不用改,只需要改下配置文件。

技術分享
 1 # https://docs.djangoproject.com/en/1.10/ref/settings/#databases  官網文檔
 2 # DATABASES = {             # sqlite 默認
 3 #     ‘default‘: {
 4 #         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
 5 #         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
 6 #     }
 7 # }
 8 DATABASES = {               # mysql
 9     default: {
10         ENGINE: django.db.backends.mysql,
11         NAME: mydatabase,
12         USER: mydatabaseuser,
13         PASSWORD: mypassword,
14         HOST: 127.0.0.1,
15         PORT: 3306,
16     }
17 }
View Code

註意:

  • 數據庫名django不能創建,需要自己提前創建

  • Django默認使用MySQLdb模塊鏈接MySQL,但python3現在還沒有MySQLdb,所以改為用pymysql去連。在project項目名下的__init__.py裏面

    import pymysql
    pymysql.install_as_MySQLdb()

二、Django ORM基本增刪改查

1、表數據增刪改查

urls.py:

  url(r‘^orm/‘,views.orm),

技術分享
 1 from app01 import models  # 導入models模塊
 2 def orm(request):
 3 # 創建數據
 4     # 第一種方式
 5     # models.UserInfo.objects.create(username="root",password="123")
 6     # 第二種方式
 7     # obj = models.UserInfo(username=‘fzh‘, password="iajtag")
 8     # obj.save()
 9     # 第三種方式
10     # dic = {‘username‘:‘fgf‘, ‘password‘:‘666‘}
11     # models.UserInfo.objects.create(**dic)
12 
13 # 查詢數據
14     # result = models.UserInfo.objects.all()  # 查詢所有,為QuerySet類型,可理解成列表
15     # result = models.UserInfo.objects.filter(username="fgf",password="666")  # 列表
16     # result = models.UserInfo.objects.filter(username="fgf").first()  # 對象
17     # 條件查詢。filter 相當於where查詢條件,裏面的","會組成and條件
18     # for row in result:  # 打印查詢到數據。
19     #     print(row.id,row.username,row.password)
20 
21     # 查看QuerySet類型具體做了什麽事情,可以: print(result.query)
22 
23 # 刪除數據
24     # models.UserInfo.objects.all().delete()  # 刪除所有
25     # models.UserInfo.objects.filter(id=4).delete()  # 刪除所有
26 
27 # 更新數據
28     # models.UserInfo.objects.all().update(password=8888)
29     # models.UserInfo.objects.filter(id=3).update(password=888888)
30 
31     return HttpResponse(orm)
app01/views.py

2、表結構修改

  • 修改列

把最初定義的類中字段password = models.CharField(max_length=64)改為password = models.CharField(max_length=60)。重新執行python manage.py makemigrationspython manage.py migrate,則數據表結構更改了。如果列內內容超過定義大小,則數據就丟了。

  • 增加一列

類中增加一列,執行命令,會有提示信息,因為默認情況下是不允許為空的。這裏提供兩個選項。

  1. 輸入一個值,新增列已存在的行默認加上輸入的內容。
  2. email = models.CharField(max_length=32, null=True),允許為空

查看表結構變化時,刷新看不出來,需要重新打開表看效果。

  • 刪除列

類內刪掉相應的字段,執行命令即可。

三、Django ORM 字段類型

1、字段類型介紹

Django ORM 字段類型中,有CharField、EmailField、URLField、GenericIPAddressField等,實際上在數據庫裏都是字符串。不能做檢查語法,做不了驗證。那這個有什麽用呢?

這些是給Django 的 admin 用的。在admin那個網頁上做驗證。如果不用admin,那那些都是字符串,效果都一樣。

自定義自增列models.AutoField(primary_key=True)

1、models.AutoField  自增列 = int(11)
  如果沒有的話,默認會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須將給列設置為主鍵 primary_key=True。
2、models.CharField  字符串字段
  必須 max_length 參數
3、models.BooleanField  布爾類型=tinyint(1)
  不能為空,Blank=True
4、models.ComaSeparatedIntegerField  用逗號分割的數字=varchar
  繼承CharField,所以必須 max_lenght 參數
5、models.DateField  日期類型 date
  對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次創建添加,之後的更新不再改變。
6、models.DateTimeField  日期類型 datetime
  同DateField的參數
7、models.Decimal  十進制小數類型 = decimal
  必須指定整數位max_digits和小數位decimal_places
8、models.EmailField  字符串類型(正則表達式郵箱) =varchar
  對字符串進行正則表達式
9、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、)
13、models.GenericIPAddressField  字符串類型(ip4和ip6是可選的)
  參數protocol可以是:both、ipv4、ipv6
  驗證時,會根據設置報錯
14、models.NullBooleanField  允許為空的布爾類型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  減號、下劃線、字母、數字
18、models.SmallIntegerField  數字
  數據庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正則表達式
22、models.BinaryField  二進制
23、models.ImageField   圖片
24、models.FilePathField 文件

  

如上那麽多的字段,可大致分為 字符串、數字、時間、二進制、自增(primary_key=True)幾類。

2、字段參數介紹

  • 數據庫中的字段參數
null                # 是否可以為空
default             # 默認值
primary_key         # 主鍵
db_column           # 列名
db_index            # 索引(db_index=True)
unique              # 唯一索引(unique=True)
unique_for_date     # 只對日期索引
unique_for_month    # 只對月份索引
unique_for_year     # 只對年做索引
auto_now            # 創建時,自動生成時間
auto_now_add        # 更新時,自動更新為當前時間

 # 更新時間不支持這種
        obj = UserGroup.objects.filter(id=1).update(caption=‘CEO‘)  
        obj = UserGroup.objects.filter(id=1).first()  # 自動更新時間需要這樣寫
        obj.caption = "CEO"
        obj.save()

  

  • 以下是只針對admin的字段參數
choices             # 作用:1、django admin中顯示下拉框;2、避免連表查詢
user_type_choices = (  # 數據庫只存1、2、3,後面的信息存在內存裏。
            (1, ‘超級用戶‘),
            (2, ‘普通用戶‘),
            (3, ‘普普通用戶‘),
)
user_type_id = models.IntegerField(choices=user_type_choices,default=1)
blank              # django admin是否可以為空
verbose_name       # django admin顯示字段中文
editable           # django admin是否可以被編輯
error_messages     # 錯誤信息
    # error_messages={"required":"密碼不能為空",}  # 註意必須有逗號
help_text          # django admin提示
validators         # django form ,自定義錯誤信息

python manage.py createsuperuser    # 創建 Django 用戶

  

3、Django ORM 外鍵操作

連表關系之一對多,models.ForeignKey(ColorDic)

models.py

  • 表關聯
class UserGroup(models.Model):
    uid = models.AutoField(primary_key=True)
    caption = models.CharField(max_length=32,unique=True)
    ctime = models.DateTimeField(auto_now_add=True, null=True)
    uptime = models.DateTimeField(auto_now=True, null=True)

class UserInfo(models.Model):
    username = models.CharField(max_length=32,blank=True,verbose_name=‘用戶名‘)
    password = models.CharField(max_length=60, help_text=‘pwd‘)
    email = models.CharField(max_length=60)
    test = models.EmailField(max_length=19,null=True,error_messages={‘invalid‘: ‘請輸入密碼‘,})
    # UserInfo表中沒有user_group字段,而是 user_group_id 列 值為 uid 數字
    user_group = models.ForeignKey("UserGroup",to_field=‘uid‘)      # 外鍵關聯 **********

  

  • 數據查詢
user_list = Userinfo.objects.all()  # 獲取Userinfo對象
for row in user_list:               # 
    print(row.user_group_id)        # 數據庫裏真實存在的數據
    # user_group:代指UserGroup對象。類UserGroup對象裏封裝了(uid,catption,ctime,uptime)
    print(row.user_group.uid)       # 通過對象獲取uid,和user_group_id一樣
    print(row.user_group.caption)   # 通過對象獲取caption

  

  • 創建數據

UserInfo表創建數據,怎麽寫呢?

models.UserInfo.objects.create(
        username=‘root1‘,
        password=‘123‘,
        email="asdfasdf",
        test="asdfasdf",
        # 第一種方式:再次查詢數據庫,不推薦
        # user_group = models.UserGroup.objects.filter(id=1).first()
        # 第二種方式:通過 外鍵字段_id
        user_group_id = 1
    )

轉載來源:http://blog.csdn.net/fgf00/article/details/53678205



Django入門4: ORM 數據庫操作