其實許多web框架都是用的pymysql來鏈接控制數據庫,但Django還提供了ORM的數據庫操做辦法(本質也是pymysql);兩種方式皆可,但咱們有必要去學一下ORMjavascript
- 再也不關注用的是
mysql
、oracle
...等.- 經過簡單的配置就能夠輕鬆更換數據庫, 而不須要修改代碼.
ORM操做:html
http請求:java
url -> 視圖(模板+數據)python
ORM操做表:mysql
建立表、修改表、刪除表web
操做數據行:sql
增刪改查數據庫
ORM利用pymysql等第三方工具鏈接數據庫django
默認sqlitesession
默認:mysql -> MYSQLDB(修改django默認鏈接mysql的方式
默認setting文件這樣設置的:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
咱們須要修改爲以下配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
# 以下設置放置的與project同名的配置的 __init__.py文件中
# 因爲Django內部鏈接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,因此須要使用pymysql來代替 import pymysql pymysql.install_as_MySQLdb()
要是出現這個bug這樣修復--> django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
總結準備步驟就是:
接下來就建立一個類,讓類給我們生成表:
在app01文件夾裏的models.py修改:
from django.db import models #建立表、列(id\nid... class UserInfo(models.Model): nid = models.BigAutoField(primary_key=True) #這行不寫Django默認會自動建立id而且是自增主鍵,因此之後能夠不用寫這行了! username = models.CharField(max_length=32) password = models.CharField(max_length=64)
那如何讓class給咱建立表呢?..再去setting裏註冊上app01:
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01' ]
最後就要放大招:生成表!這兩命令記在骨髓裏!!!
#要是你app裏沒有migrations文件先要生成下! #python manage.py makemigrations --empty app01 python manage.py makemigrations python manage.py migrate
看它一一會兒除了咱們本身的表還有不少表,這些表其實與Django自帶的那個後臺有關:
此時,migrations文件夾下就生成相應配置文件,輕易不要刪除哦~
假如之後你想在class裏修改表名,請直接修改,再執行一次「骨髓命令」就行!有數據也不要緊!
假如之後你想在加一列age = models.IntegeField(),直接加就行,可是....
若原表中有數據了,只要指定age = models.IntegeField(null=True)或者age = models.IntegeField(default=xxx)
若建立一對多等關係就例如 ug = models.ForeignKey("UserGroup",null=True) #生成是外鍵 ug_id
數據庫相關操做:增刪改查
#test可刪 def test(requst): from app01 import models #新增 models.UserInfo.objects.create(username='shannon',password='111111') #查找 #userinfo QuerySet類型(列表)[obj,obj,obj] userinfo = models.UserInfo.objects.all() for row in userinfo: print(row.nid,row.username) #加條件的查找filter() # ,是and ; id__gt=1 是id大於1;id__lt=1 是id小於1 userinfo = models.UserInfo.objects.filter(nid=2,username='shannon') #刪除,刪前得先找到~ models.UserInfo.objects.filter(nid=1).delete() #更新 models.UserInfo.objects.filter(nid=4).update(password='123') return HttpResponse('成功')
ORM連表操做
《models.py》
from django db import models class UserType(models Model): #用戶類型 title= models.CharField(max length=32) class UserInfo(models. Model): #用戶表 name= models.CharField(max length=16) age= models.IntegerFieldo ut= models.ForeignKey(UserType)
------------------------------------------------
#獲取
#QuerySet[obj,obj,obj] 是列表類型
result =models.UserInfo objects.all()
for obj in resylt:
print(obj.name,obj.age,obj.ut_id,obj.ut.title)
#其實Django幫你作了連表
QuerySet[obj,obj,obj] 是列表類型
#UserInfo, ut是FK字段 - 正向操做 (一個用戶只有一個用戶類型)
#UserInfo ,表名小寫_set.all() - 反向操做 (一個用戶類型下能夠有不少用戶)
問題描述
在進行django開發過程當中,對app的內容進行更新,發現更新的內容顯示在文末,沒有顯示在開頭,指望全部的內容根據更新時間倒序顯示
解決方法
問題很好解決,咱們只須要在models裏面添加以下代碼:
class Gally(models.Model): title = models.CharField(max_length=50, verbose_name='標題') create_time = models.DateTimeField(default=timezone.now, verbose_name='建立時間') class Meta: ordering = ('-create_time',)
便可實現經過create_time 倒序排列,固然你也能夠
ordering = ('-id',) 也就是最新的顯示在最前面。
若是要正序,也很簡單,去掉create_time 的 ‘-’ 符號就能夠了
————————————————
固然,還有一種簡單的方法:直接在查詢後面加order_by
user_list = models.UserInfo.objects.all().order_by('id') #倒序: user_list = models.UserInfo.objects.all().order_by('-id') #多個排序條件,先左後右原則 user_list = models.UserInfo.objects.all().order_by('id','name')
ethtool