日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django模型(一)

發布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django模型(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Django模型(一)

文章目錄

  • Django模型(一)
    • 一、配置Django使用mysql數據庫
    • 二、案例
      • 1.定義模型類
      • 2.打開booktest/models.py文件
      • 3.遷移
      • 4.測試數據
      • 5.定義視圖
      • 6.配置url
      • 7.創建模板
      • 8.運行
    • 三、定義屬性
      • 1.Django根據屬性的類型確定以下信息:
      • 2.屬性命名限制:
      • 3.字段類型
      • 4.選項
      • 5.查詢函數
      • 6.綜合演示

  • O(objects):類和對象。
  • R(Relation):關系,關系數據庫中的表格。
  • M(Mapping):映射。
    Django ORM框架的功能:
  • a)建立模型類和表之間的對應關系,允許我們通過面向對象的方式來操作數據庫。
  • b)根據設計的模型類生成數據庫中的表格。
  • c)通過方便的配置就可以進行數據庫的切換。

一、配置Django使用mysql數據庫

  • 1.進入虛擬環境py_django。
workon py_django
  • 2.在/home/python/pytest目錄下創建項目test2。
django-admin startproject test2

  • 3.打開test2/settings.py文件,找到DATABASES項,默認使用SQLite3數據庫

修改為使用MySQL數據庫,代碼如下:

將引擎改為mysql,
提供連接的主機HOST
端口PORT
數據庫名NAME
用戶名USER
密碼PASSWORD。

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'test2', #數據庫名字,'USER': 'root', #數據庫登錄用戶名'PASSWORD': 'mysql', #數據庫登錄密碼'HOST': 'localhost', #數據庫所在主機'PORT': '3306', #數據庫端口} }
  • 4.數據庫切換成了mysql,需要安裝pymysql模塊之后,Django框架才可以操作mysql數據庫。安裝命令如下:
pip install pymysql
  • 5.安裝成功之后,在test2/_init_.py文件中加上如下代碼:
import pymysql pymysql.install_as_MySQLdb()


注意:數據庫test2 Django框架不會自動生成,需要我們自己進入mysql數據庫去創建。

  • 6.下面是手動創建數據庫,打開新終端,在命令行登錄mysql,創建數據庫test2。

注意:設置字符集為utf8

create database test2 charset=utf8;

  • 7.返回第一個終端,進入test2目錄,創建應用booktest。
cd test2 python manage.py startapp booktest

  • 8.將應用booktest注冊到項目中:打開test2/settings.py文件,找到INSTALLED_APPS項,加入如下代碼
'booktest',

二、案例

1.定義模型類

  • 模型類被定義在"應用/models.py"文件中,此例中為"booktest/models.py"文件。
  • 模型類必須繼承自Model類,位于包django.db.models中。
  • 提示:對于重要數據使用邏輯刪除。

2.打開booktest/models.py文件

定義模型類如下

from django.db import models#定義圖書模型類BookInfo class BookInfo(models.Model):btitle = models.CharField(max_length=20)#圖書名稱bpub_date = models.DateField()#發布日期bread = models.IntegerField(default=0)#閱讀量bcomment = models.IntegerField(default=0)#評論量isDelete = models.BooleanField(default=False)#邏輯刪除#定義英雄模型類HeroInfo class HeroInfo(models.Model):hname = models.CharField(max_length=20)#英雄姓名hgender = models.BooleanField(default=True)#英雄性別isDelete = models.BooleanField(default=False)#邏輯刪除hcomment = models.CharField(max_length=200)#英雄描述信息hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中

3.遷移

  • 生成遷移文件
python manage.py makemigrations
  • 然后執行如下命令
python manage.py makemigrations python manage.py migrate

  • 打開數據庫的命令行,查看當前所有表如下圖:

  • 表bookinfo結構如:

默認值并不在數據庫層面生效,而是在django創建對象時生效。

  • 表booktest_heroinfo結構如下:

Django框架會根據關系屬性生成一個關系字段,并創建外鍵約束。

4.測試數據

在數據庫命令行中,復制如下語句執行,向booktest_bookinfo表中插入測試數據:

insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values ('射雕英雄傳','1980-5-1',12,34,0), ('天龍八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飛狐','1987-11-11',58,24,0);

向booktest_heroinfo表中插入測試數據:

insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values ('郭靖',1,1,'降龍十八掌',0), ('黃蓉',0,1,'打狗棍法',0), ('黃藥師',1,1,'彈指神通',0), ('歐陽鋒',1,1,'蛤蟆功',0), ('梅超風',0,1,'九陰白骨爪',0), ('喬峰',1,2,'降龍十八掌',0), ('段譽',1,2,'六脈神劍',0), ('虛竹',1,2,'天山六陽掌',0), ('王語嫣',0,2,'神仙姐姐',0), ('令狐沖',1,3,'獨孤九劍',0), ('任盈盈',0,3,'彈琴',0), ('岳不群',1,3,'華山劍法',0), ('東方不敗',0,3,'葵花寶典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若蘭',0,4,'黃衣',0), ('程靈素',0,4,'醫術',0), ('袁紫衣',0,4,'六合拳',0);

5.定義視圖

打開booktest/views.py文件,定義視圖代碼如下:

from django.shortcuts import render,redirect from booktest.models import * from datetime import date#查詢所有圖書并顯示 def index(request):list=BookInfo.objects.all()return render(request,'booktest/index.html',{'list':list})#創建新圖書 def create(request):book=BookInfo()book.btitle = '流星蝴蝶劍'book.bpub_date = date(1995,12,30)book.save()#轉向到首頁return redirect('/')#邏輯刪除指定編號的圖書 def delete(request,id):book=BookInfo.objects.get(id=int(id))book.delete()#轉向到首頁return redirect('/')

6.配置url

打開test2/urls.py文件,配置url如下:

from django.conf.urls import include, url from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),#引入booktest的url配置url(r'^',include('booktest.urls')), ]

在booktest應用下創建urls.py文件,代碼如下:

from django.conf.urls import url from booktest import viewsurlpatterns=[url(r'^$',views.index),url(r'^delete(\d+)/$',views.delete),url(r'^create/$',views.create), ]

7.創建模板

打開test2/settings.py文件,配置模板查找目錄TEMPLATES的DIRS。

'DIRS': [os.path.join(BASE_DIR,'templates')],


創建templates/booktest/index.html文件。

模板代碼如下:

<html> <head><title>復習案例</title> </head> <body> <a href="/create/">創建</a> <ul> {%for book in list%}<li>{{book.btitle}}--<a href="/delete{{book.id}}/">刪除</a></li> {%endfor%} </ul> </body> </html>

8.運行

運行服務器。

python manage.py runserver

在瀏覽器中查看

操作效果如下圖

運行

在mysql命令行中查看數據表變化如下圖:

三、定義屬性

1.Django根據屬性的類型確定以下信息:

  • 當前選擇的數據庫支持字段的類型
  • 渲染管理表單時使用的默認html控件
  • 在管理站點最低限度的驗證
  • django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后django不會再創建自動增長的主鍵列。
  • 默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。

注意:pk是主鍵的別名,若主鍵名為id2,那么pk是id2的別名。

2.屬性命名限制:

  • 不能是python的保留關鍵字。
  • 不允許使用連續的下劃線,這是由django的查詢方式決定的
  • 定義屬性時需要指定字段類型,通過字段類型的參數指定選項,語法如下:
屬性=models.字段類型(選項)

3.字段類型

使用時需要引入django.db.models包,字段類型如下:

  • AutoField:自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性。
  • BooleanField:布爾字段,值為True或False。
  • NullBooleanField:支持Null、True、False三種值。
  • CharField(max_length=字符長度):字符串
  • 參數max_length表示最大字符個數。
  • TextField:大文本字段,一般超過4000個字符時使用。
  • IntegerField:整數。
  • DecimalField(max_digits=None, decimal_places=None):十進制浮點數
  • 參數max_digits表示總位數。
  • 參數decimal_places表示小數位數。
  • FloatField:浮點數。
  • DateField[auto_now=False, auto_now_add=False]):日期。
  • 參數auto_now表示每次保存對象時,自動設置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為false。
  • 參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用于創建的時間戳,它總是使用當前日期,默認為false。
  • 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。
  • TimeField:時間,參數同DateField。
  • DateTimeField:日期時間,參數同DateField。
  • FileField:上傳文件字段。
  • ImageField:繼承于FileField,對上傳的內容進行校驗,確保是有效的圖片。

4.選項

通過選項實現對字段的約束,選項如下:

  • null:如果為True,表示允許為空,默認值是False。
  • blank:如果為True,則該字段允許為空白,默認值是False。
  • 對比:null是數據庫范疇的概念,blank是表單驗證范疇的。
  • db_column:字段的名稱,如果未指定,則使用屬性的名稱。
  • db_index:若值為True, 則在表中會為此字段創建索引,默認值是False。
  • default:默認值。
  • primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用。
  • unique:如果為True, 這個字段在表中必須有唯一值,默認值是False。

對比:null是數據庫范疇的概念,blank是后臺管理頁面表單驗證范疇的。
經驗:
當修改模型類之后,如果添加的選項不影響表的結構,則不需要重新做遷移,商品的選項中default和blank不影響表結構。

5.查詢函數

通過模型類.objects屬性可以調用如下函數,實現對模型類對應的數據表的查詢。

6.綜合演示

修改booktest/models.py中的模型類,代碼如下:

from django.db import models#定義圖書模型類BookInfo class BookInfo(models.Model):#btitle = models.CharField(max_length=20)#圖書名稱btitle = models.CharField(max_length=20, db_column='title')#通過db_column指定btitle對應表格中字段的名字為titlebpub_date = models.DateField()#發布日期bread = models.IntegerField(default=0)#閱讀量bcomment = models.IntegerField(default=0)#評論量isDelete = models.BooleanField(default=False)#邏輯刪除#定義英雄模型類HeroInfo class HeroInfo(models.Model):hname = models.CharField(max_length=20)#英雄姓名hgender = models.BooleanField(default=True)#英雄性別isDelete = models.BooleanField(default=False)#邏輯刪除#hcomment = models.CharField(max_length=200)#英雄描述信息hcomment = models.CharField(max_length=200, null=True, blank=False) #hcomment對應的數據庫中的字段可以為空,但通過后臺管理頁面添加英雄信息時hcomment對應的輸入框不能為空hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中

然后生成遷移文件并執行遷移命令,最后查看test2數據庫中的內容。

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的Django模型(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。