ORM介紹
對象關係映射(Object Relational Mapping,簡稱ORM)模式的作用是在關係型數據庫與業務實體對象之間進行映射,這使得我們不需要再去和複雜的SQL語句打交道,只需要簡單的操作對象的屬性和方法。ORM通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。
ORM的優勢體現在以下三個方面:
1. 可移植性強,在Django中只需要在settings.py文件中修改新數據庫的配置,然後進行遷移數據的操作即可完成數據庫的移植,二部需要對ORM進行任何修改
2. 查詢語法簡單,讓軟件開發人員專注於業務邏輯的處理,提高了開發效率
ORM在Django中的應用
字段
AutoField(Field)
- int自增列,必須填入參數 primary_key=True
BigAutoField(AutoField)
- bigint自增列,必須填入參數 primary_key=True
注:當model中如果沒有自增列,則自動會創建一個列名為id的列
from django.db import models
class UserInfo(models.Model):
# 自動創建一個列名為id的且為自增的整數列
username = models.CharField(max_length=32)
class Group(models.Model):
# 自定義自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
SmallIntegerField(IntegerField):
- 小整數 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整數 0 ~ 32767
IntegerField(Field)
- 整數列(有符號的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整數 0 ~ 2147483647
BigIntegerField(IntegerField):
- 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
BooleanField(Field)
- 布爾值類型
NullBooleanField(Field):
- 可以為空的布爾值
CharField(Field)
- 字符類型
- 必須提供max_length參數, max_length表示字符長度
TextField(Field)
- 文本類型
EmailField(CharField):
- 字符串類型,Django Admin以及ModelForm中提供驗證機制
IPAddressField(Field)
- 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
GenericIPAddressField(Field)
- 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
- 參數:
protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啓此功能,需要protocol="both"
URLField(CharField)
- 字符串類型,Django Admin以及ModelForm中提供驗證 URL
SlugField(CharField)
- 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、連接符(減號)
CommaSeparatedIntegerField(CharField)
- 字符串類型,格式必須為逗號分割的數字
UUIDField(Field)
- 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證
FilePathField(Field)
- 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
- 參數:
path, 文件夾路徑
match=None, 正則匹配
recursive=False, 遞歸下面的文件夾
allow_files=True, 允許文件
allow_folders=False, 允許文件夾
FileField(Field)
- 字符串,路徑保存在數據庫,文件上傳到指定目錄
- 參數:
upload_to = "" 上傳文件的保存路徑
storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage
ImageField(FileField)
- 字符串,路徑保存在數據庫,文件上傳到指定目錄
- 參數:
upload_to = "" 上傳文件的保存路徑
storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage
width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串)
height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串)
DateTimeField(DateField)
- 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin, Field)
- 日期格式 YYYY-MM-DD
TimeField(DateTimeCheckMixin, Field)
- 時間格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field)
- 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型
FloatField(Field)
- 浮點型
DecimalField(Field)
- 10進制小數
- 參數:
max_digits,小數總長度
decimal_places,小數位長度
BinaryField(Field)
- 二進制類型
字段相關內容
View Code
自定義字段
class FixedCharField(models.Field):
"""
自定義的char類型的字段類
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
"""
限定生成數據庫表的字段類型為char,長度為max_length指定的值
"""
return 'char(%s)' % self.max_length
class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用自定義的char類型的字段
cname = FixedCharField(max_length=25)
PS: 返回值為字段在數據庫中的屬性,Django字段默認的值為:
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
mysql操作
1. 環境
windows/python3.6.0/mysql/MySQLdb,若對mysql操作不熟悉可以查看數據庫之MySql
2. 進入root,創建新賬户
mysql -u root -p
create user "hello"@"local" identifild by "123456789";
3. 創建djangodb數據庫
create database IF NOT EXISTS 'djangodb';
4. 為新用户授權
grant all privileges on djangodb.* to "hello"@"localhost";
flush privileges;
5. 退出root用hello賬户登錄,查看數據庫
mysql -u hello -p
mysql show databases;
django操作mysql
1. 創建工程和應用
django-admin startproject django_mysql
python manage.py startapp blog
可以使用tree /f查看django_mysql目錄,以下為blog目錄結構
2. 修改setting.py文件中和數據庫相關的設置
DATABASES = {
'default': {'ENGINE':'django.db.backends.mysql',
'HOST':'127.0.0.1',
'PORT':'3306',
'NAME':'djangodb',
'USER':'hello',
'PASSWORD':'123456789',
}
3. 通過模型設計數據表
./blog/model.py
from django.db import models
# Create your models here.
from django.db import models #特別注意
class userinfo(models.Model):
username=models.CharField(max_length=32)
password=models.CharField(max_length=32)
age=models.IntegerField()
4. 向數據表中添加項
./blog/views.py
from django.shortcuts import HttpResponse
from .models import userinfo
# Create your views here.
def db_handle(request):
#向數據庫中添加數據
#dic = {"username":"bruce","password":"123456","age":23}
#dic = {"username":"zhanglin","password":"666666","age":18}
dic = {"username":"lishi","password":"1123", "age":99}
objects = userinfo.objects.all()
print (objects)
isexists = False
if not objects and not isexists:
userinfo.objects.create(**dic)
else:
for object in objects:
print(object)
if dic["username"] == object.username:
isexists = True
#HttpResponse("username is exits\r\t") #該語句為什麼沒起作用
break
if not isexists:
userinfo.objects.create(**dic)
#刪除數據
#userinfo.objects.filter(username="bruce").delete()
#更新數據
#userinfo.objects.filter(username="lishi").update(age=99)
#HttpResponse("ok")
return render(request, "mysql.html", {"tablerow":objects})
上面的代碼中包含了向數據庫中添加、刪除和更新數據
5. 測試
打開django服務,數據url
python manage.py runserver
http://127.0.0.1:8000/db_handle/
在mysql中查看數據庫
圖中的blog_userinfo就是我們的數據表,命名方式:應用+models.py中的userinfo函數
渲染
接下來我們將數據庫內容通過html顯示到網頁上
1. 添加templates相關信息
settings.py文件中設置templates路徑
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
'APP_DIRS': False,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
在django_mysql添加templates目錄並添加mysql.html文件
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="X-UA_compatible" content="IE=Edge">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>django_mysql info</title>
</head>
<body>
<h1>django_mysql info</h1>
<div class="container">
<table border="1" width="300">
<tr>
<th>用户名</th>
<th>密碼</th>
<th>年齡</th>
</tr>
{%for row in tablerow%}
<tr>
<td>{{row.username}}</td>
<td>{{row.password}}</td>
<td>{{row.age}}</td>
</tr>
{%endfor%}
</table>
</div>
</body>
</html>
2. 添加urls
在應用的urls.py文件中添加如下信息
from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
path('admin/', admin.site.urls),
path(r'db_handle/', views.db_handle),
]
3. 渲染的代碼已經在views.py中添加
return render(request, "mysql.html", {"tablerow":objects})
4. 打開http://127.0.0.1:8000/db_handle/測試