Django學習筆記(4)——Django鏈接數據庫

前言

  在MVC或者MTV設計模式中,模型(M)表明對數據庫的操做。那麼如何操做數據庫呢?本小節就認真學習一下。首先複習一下Django的整個實現流程 ,而後再實現一下使用數據庫的整個流程,最後學習一下鏈接數據庫須要瞭解的知識。html

  其實以前已經有學習過,能夠參考博客:Django學習筆記:初始Djangopython

  可是這裏想詳細的進行學習,首先對Django 一些基本的知識點進行了解。mysql

1,Django的流程實現

django
    #安裝: pip3 install django

          添加環境變量

    #1  建立project
       django-admin startproject mysite

       ---mysite

          ---settings.py
          ---url.py
          ---wsgi.py

       ---- manage.py(啓動文件)  

    #2  建立APP       
       python mannage.py startapp  app01

    #3  settings配置
    
       TEMPLATES

       STATICFILES_DIRS=(
            os.path.join(BASE_DIR,"template"),
        )

       STATIC_URL = '/static/' 
       #  咱們只能用 STATIC_URL,但STATIC_URL會按着你的    STATICFILES_DIRS去找

    #4  根據需求設計代碼
           url.py
           view.py

    #5  使用模版
       render(req,"index.html")   

    #6  啓動項目
       python manage.py runserver  127.0.0.1:8090

    #7  鏈接數據庫,操做數據
       model.py

  

2,代碼填充

  根據需求,咱們先完成主程序(也就是mysite/urls.py)的內容:git

from mysql01 import views

# admin 後臺的路由,先註釋掉
urlpatterns = [
    path('admin/', admin.site.urls),
    # 你的路由,重點是引號中的正則表達式和後面的業務邏輯函數
    path('index/',views.index),
    # url(r'index/',views.index),
]

  注意:關於django.urls path 和django.conf.urls url 的區別,django中 url 和 path 都是配置路徑,有什麼不一樣呢?程序員

  path 和 url 是兩個不一樣的模塊,效果都是響應返回頁面,path調用的是python第三方模塊或者框架,而url則是自定義的模塊。github

  固然,主要問題在於版本:  1.x版本用url   2.x 版本用path正則表達式

 

  再填充咱們APP的viewssql

from django.shortcuts import render

# Create your views here.
def index(req):
    return render(req,'index.html')

  

  完成本身寫的index.html文件(隨便寫的,內容以下)shell

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
    <h1 style='background-color: antiquewhite;color:black;'>hello world</h1>
    <h1>用戶輸入</h1>
    <form action="/index/" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>

</body>

</html>

  

  當你寫入一個HTML文件在templates中,爲了讓Django知道咱們的HTML文件在哪裏,須要修改settings文件的相應內容,可是默認狀況下,他正好使用,無需修改,除非特殊狀況。數據庫

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 要是有這一行,若是已經存在請保持原樣
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]

  

3,運行程式

  直接輸出下面代碼便可運行Django:

python manage.py  runserver

  在瀏覽器輸入下面代碼便可顯示index.html內容:

127.0.0.1:8000/index

  

一,使用Django自帶的sqlite3數據庫

  Django經過自帶的ORM框架能夠操做數據庫,而且自帶輕量級的sqlite3數據庫,Django默認使用SQLite數據庫,由於Python源生支持SQLite數據庫,因此咱們無需安裝任何程式,就能夠直接使用,下面咱們先練習一下。

1.1  在settings中,配置數據庫相關參數

  由於是自帶的sqlite,因此無需修改,這裏咱們看一下:

# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        # 這裏能夠指定使用的數據庫類型,例如mysql
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

  

1.2 編譯models.py

  Django經過自定義python類的形式來定義具體的模型,每一個模型的物理存在方式就是一個python的Class,每一個模型表明數據庫中的一張表,每一個類的實例表明數據庫中的一行數據,類中的每一個變量表明數據庫中的一列字段。

  Django經過模型,將python代碼和數據庫操做結合起來,實現對SQL查詢語言的封裝。也就是說,你能夠不會管理數據庫,能夠不會SQL語言,你一樣能經過python的代碼進行數據庫的操做。DJango經過ORM對數據庫進行操做,下面直接看代碼:

from django.db import models

# Create your models here.
class UserInfo(models.Model):
    '''
        建立兩個字段,最大長度是32,類型是char
        '''
    user = models.CharField(max_length= 32)
    pwd = models.CharField(max_length= 32)

  這裏咱們建立了兩個字段,分別保存用戶的名稱和密碼。

  上面的代碼,至關於下面的原生SQL語句。

CREATE TABLE UserInfo (
    "id" serial NOT NULL PRIMARY KEY,
    "user" varchar(30) NOT NULL,
    "pwd" varchar(30) NOT NULL
);

  注意:

  • Django默認自動建立自增主鍵ID,固然也能夠本身指定主鍵。
  • 上面的SQL語法基於PostgreSQL

更多字段和參數

  每一個字段有一些特有的參數,例如,CharField 須要 max_length 參數來指定VARCHAR 數據庫字段的大小。還有一些適用於全部字段的通用參數。這些參數在文檔中有詳細定義,這裏咱們學習一下最經常使用的:

<1> CharField
       字符串字段, 用於較短的字符串.
       CharField 要求必須有一個參數 maxlength, 用於從數據庫層和Django校驗層
限制該字段所容許的最大字符數.
 
 
<2> IntegerField
      #用於保存一個整數.
 
 
<3> FloatField
       一個浮點數. 必須 提供兩個參數:
 
       參數    描述
       max_digits    總位數(不包括小數點和符號)
       decimal_places    小數位數
               舉例來講, 要保存最大值爲 999 (小數點後保存2位),你要這樣定義字段:
 
               models.FloatField(..., max_digits=5, decimal_places=2)
               要保存最大值一百萬(小數點後保存10位)的話,你要這樣定義:
 
               models.FloatField(..., max_digits=19, decimal_places=10)
               admin 用一個文本框(<input type="text">)表示該字段保存的數據.
 
 
<4> AutoField
       一個 IntegerField, 添加記錄時它會自動增加. 你一般不須要直接使用這個字段;
       自定義一個主鍵:my_id=models.AutoField(primary_key=True)
       若是你不指定主鍵的話,系統會自動添加一個主鍵字段到你的 model.
 
 
<5> BooleanField
       A true/false field. admin 用 checkbox 來表示此類字段.
 
 
<6> TextField
       一個容量很大的文本字段.
       admin 用一個 <textarea> (文本區域)表示該字段數據.(一個多行編輯框).
 
 
<7> EmailField
       一個帶有檢查Email合法性的 CharField,不接受 maxlength 參數.
 
 
<8> DateField
       一個日期字段. 共有下列額外的可選參數:
       Argument    描述
       auto_now    當對象被保存時,自動將該字段的值設置爲當前時間.一般用於表
示 "last-modified" 時間戳.
       auto_now_add    當對象首次被建立時,自動將該字段的值設置爲當前時間.
一般用於表示對象建立時間.
       (僅僅在admin中有意義...)
 
 
<9> DateTimeField
        一個日期時間字段. 相似 DateField 支持一樣的附加選項.
 
 
<10> ImageField
       相似 FileField, 不過要校驗上傳對象是不是一個合法圖片.#它有兩個可選參
數:height_field和width_field,
       若是提供這兩個參數,則圖片將按提供的高度和寬度規格保存.   
 
<11> FileField
    一個文件上傳字段.
    要求一個必須有的參數: upload_to, 一個用於保存上載文件的本地文件系統路徑.
 這個路徑必須包含 strftime #formatting,
    該格式將被上載文件的 date/time
    替換(so that uploaded files don't fill up the given directory).
    admin 用一個<input type="file">部件表示該字段保存的數據(一個文件上傳部件) .
 
    注意:在一個 model 中使用 FileField 或 ImageField 須要如下步驟:
           (1)在你的 settings 文件中, 定義一個完整路徑給 MEDIA_ROOT 以便讓
 Django在此處保存上傳文件.
           (出於性能考慮,這些文件並不保存到數據庫.) 定義MEDIA_URL 做爲該目錄
的公共 URL. 要確保該目錄對
            WEB服務器用戶賬號是可寫的.
           (2) 在你的 model 中添加 FileField 或 ImageField, 並確保定義了
upload_to 選項,以告訴 Django
            使用 MEDIA_ROOT 的哪一個子目錄保存上傳文件.你的數據庫中要保存的只是
文件的路徑(相對於 MEDIA_ROOT).
            出於習慣你必定很想使用 Django 提供的 get_<#fieldname>_url 函數.舉
例來講,若是你的 ImageField
            叫做 mug_shot, 你就能夠在模板中以 {{ object.#get_mug_shot_url }}
這樣的方式獲得圖像的絕對路徑.
 
 
<12> URLField
     用於保存 URL. 若 verify_exists 參數爲 True (默認), 給定的 URL 會預先檢查是否
存在( 即URL是否被有效裝入且
     沒有返回404響應).
     admin 用一個 <input type="text"> 文本框表示該字段保存的數據(一個單行編輯框)
 
<13> NullBooleanField
      相似 BooleanField, 不過容許 NULL 做爲其中一個選項. 推薦使用這個字段而不要用
BooleanField 加 null=True 選項
      admin 用一個選擇框 <select> (三個可選擇的值: "Unknown", "Yes" 和 "No" )
來表示這種字段數據.
 
 
<14> SlugField
      "Slug" 是一個報紙術語. slug 是某個東西的小小標記(短籤), 只包含字母,數字,下劃線
和連字符.#它們一般用於URLs
      若你使用 Django 開發版本,你能夠指定 maxlength. 若 maxlength 未指定, Django
 會使用默認長度: 50.  #在
      之前的 Django 版本,沒有任何辦法改變50 這個長度.
      這暗示了 db_index=True.
      它接受一個額外的參數: prepopulate_from, which is a list of fields from which to auto-#populate
      the slug, via JavaScript,in the object's admin form: models.SlugField
      (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.
 
 
<13> XMLField
       一個校驗值是否爲合法XML的 TextField,必須提供參數: schema_path, 它是一個
用來校驗文本的 RelaxNG schema #的文件系統路徑.
 
 
<14> FilePathField
       可選項目爲某個特定目錄下的文件名. 支持三個特殊的參數, 其中第一個是必須提供的.
       參數    描述
       path    必需參數. 一個目錄的絕對文件系統路徑. FilePathField 據此獲得可選項目.
       Example: "/home/images".
       match    可選參數. 一個正則表達式, 做爲一個字符串, FilePathField 將使用它過濾文件名.
       注意這個正則表達式只會應用到 base filename 而不是
       路徑全名. Example: "foo.*\.txt^", 將匹配文件 foo23.txt 卻不匹配 bar.txt 或 foo23.gif.
       recursive可選參數.要麼 True 要麼 False. 默認值是 False. 是否包括 path 下面的所有子目錄.
       這三個參數能夠同時使用.
       match 僅應用於 base filename, 而不是路徑全名. 那麼,這個例子:
       FilePathField(path="/home/images", match="foo.*", recursive=True)
       ...會匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
 
 
<15> IPAddressField
       一個字符串形式的 IP 地址, (i.e. "24.124.1.30").
 
 
<16> CommaSeparatedIntegerField
       用於存放逗號分隔的整數值. 相似 CharField, 必需要有maxlength參數.

  

更多參數

(1)null
 
若是爲True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False.
 
(1)blank
 
若是爲True,該字段容許不填。默認爲False。
要注意,這與 null 不一樣。null純粹是數據庫範疇的,而 blank 是數據驗證範疇的。
若是一個字段的blank=True,表單的驗證將容許該字段是空值。若是字段的blank=False,該字段就是必填的。
 
(2)default
 
字段的默認值。能夠是一個值或者可調用對象。若是可調用 ,每有新對象被建立它都會被調用。
 
(3)primary_key
 
若是爲True,那麼這個字段就是模型的主鍵。若是你沒有指定任何一個字段的primary_key=True,
Django 就會自動添加一個IntegerField字段作爲主鍵,因此除非你想覆蓋默認的主鍵行爲,
不然不必設置任何一個字段的primary_key=True。
 
(4)unique
 
若是該值設置爲 True, 這個數據字段的值在整張表中必須是惟一的
 
(5)choices
由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。
 若是設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,並且這
個選擇框的選項就是choices 中的選項。

  

1.3  在終端建立表

  咱們須要在pycharm的teminal中經過命令建立數據庫的表,有兩條命令,分別是:

  生成同步數據庫的腳本代碼

python manage.py makemigrations

  經過運行makemigrations 命令,至關於告訴Django,你對模型有改動,而且你想把這些改動保存爲一個「遷移」(migration)。

  運行後,結果以下:

Migrations for 'mysql01':
  mysql01\migrations\0001_initial.py
    - Create model UserInfo

  migrations是Django保存模型修改記錄的文件,這些文件保存在磁盤上,從上面能夠看到,它就是  mysql01\migrations\0001_initial.py  。咱們能夠打開這個文件看一下,裏面保存的都是可讀而且可編譯的內容,方便咱們隨時手動修改。

  下面看一下0001_initial.py內容:

# Generated by Django 2.1.7 on 2019-03-12 01:45

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='UserInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('user', models.CharField(max_length=32)),
                ('pwd', models.CharField(max_length=32)),
            ],
        ),
    ]

  同步數據庫(也就是對數據庫執行真正的遷移動做)腳本代碼

python manage.py migrate

  migrate命令對全部還未實施的遷移記錄進行操做,本質上就是將你對模型的修改體現到數據庫中具體的表上面。Django經過一張叫作django_migrations的表,記錄並跟蹤已經實施的migrate動做,經過對比得到哪些migrations還沒有提交。

  運行後,結果以下:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, mysql01, sessions
Running migrations:
  Applying mysql01.0001_initial... OK

       注意:在開發過程當中,數據庫同步誤操做以後,不免會遇到後面不能同步成功的狀況,解決這個問題的一個簡單粗暴方法是把migrations目錄下的腳本(除__init__.py以外)所有刪掉,再把數據庫刪掉以後建立一個新的數據庫,數據庫同步操做再從新作一遍。            

       因此咱們須要爲進入這個項目的後臺建立超級管理員:

python manage.py createsuperuser

  設置好用戶名和密碼後即可登陸啦!

二,使用MySQL數據庫

  下面學習MySQL數據庫鏈接Django。

1,打開MySQL命令對話框,建立表

create database djangomysql default charset=utf8;

  在使用非SQLite的數據庫時候,請務必預先在數據庫管理系統的提示符交互模式下建立數據庫,咱們可使用命令:「CREATE DATABASE database_name;」。Django不會自動幫你作這一步工做。

2,建立一個APP

python manage.py startapp mysql02

  

3,修改Django中settings.py的相關參數,配置MySQL

  添加mysql02這個APP

INSTALLED_APPS = [
    'django.contrib.admin',  #admin後臺管理站點
    'django.contrib.auth',  # 身份認證系統
    'django.contrib.contenttypes', # 內容類型框架
    'django.contrib.sessions', # 回話框架
    'django.contrib.messages',  # 消息框架
    'django.contrib.staticfiles', # 靜態文件管理框架
    'mysql02',
]

  註釋SQLite,配置MySQL

DATABASES = {
    'default': {
        # 這裏能夠指定使用的數據庫類型,例如mysql
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangomysql',
        'USER':'root',
        'PASSWORD':'******',
        'HOST':'localhost',
        'PORT':'3306',
    }
}

 或者這樣寫:

# mysite/settings.py
 
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 
import pymysql         # 必定要添加這兩行!經過pip install pymysql!
pymysql.install_as_MySQLdb()
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'HOST': '192.168.1.1',
        'USER': 'root',
        'PASSWORD': 'pwd',
        'PORT': '3306',
    }
}

  

4,安裝MySQL-python

  必須先按照MySQLdb,否則會報以下的錯誤: 

ModuleNotFoundError: No module named 'MySQLdb'

  Django鏈接mysql默認驅動是MySQLdb,MySQLdb沒有支持python3的版本,若是使用python3.x版本的時候,Django鏈接mysql的方法是使用pymysql替換MySQLdb。

  在配置文件同目錄下的__init__.py文件中加入如下代碼(本文就是mysite下的__init__.py):

import pymysql

pymysql.install_as_MySQLdb()

  使用myslqclient代替MySQLdb,mysqlclient項目在github上的地址爲 https://github.com/PyMySQL/mysqlclient-python,該項目fork MySQLdb,加入了對python3的支持。

   安裝以下:

pip install pymysql

  沒有提示MySQLdb模塊找不到,說明按照OK。

5,編譯models.py

  Django經過自定義python類的形式定義具體的模型,每一個模型表明數據庫中的一張表,每一個類的實例表明數據表中的一行數據,類中的每一個變量表明數據表中的一列字段。

from django.db import models

# Create your models here.
class Userinfo(models.Model):
    '''
        建立兩個字段,最大長度爲32,類型是char
        '''
    user = models.CharField(max_length= 32)
    pwd = models.CharField(max_length= 32)

  

 6,在終端建立數據庫的表

  咱們須要先生成同步數據庫的腳本代碼

python manage.py makemigrations

  執行結果以下:

Migrations for 'mysql02':
  mysql02\migrations\0001_initial.py
    - Create model Userinfo

  而後同步數據庫(也就是對數據庫執行真正的遷移動做)

python manage.py migrate

  執行結果以下:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

  

7,查看mysql數據庫

  在MySQL中,進入建立的庫中,查看咱們在Django建立的表:

 

三,在pycharm上操做MySQL

  pycharm能夠建立,讀寫數據庫,不過若是想與工程相連,仍是須要在工程中用代碼連接,單擊Database側邊欄位。添加Database,以下圖:

 

  點擊「+」,而後點擊Data Sources,進入設置界面。以下:

  而後填寫鏈接信息,Database欄能夠填寫具體數據庫名稱,不填寫則加載全部數據庫。第一次使用PyCharm時會提示設置操做木馬,填寫完成後能夠點擊「Test  Connection」,測試鏈接狀況,沒有問題,點擊OK,輸入操做木馬便可完成鏈接。

  注意:這裏必須注意下載missing dirver files。

  右側爲MySQL目錄,若是修改,查看沒有找到本身的數據庫,點擊「more schemes」,如圖:

  能夠在命令行直接操做數據庫,如圖:

  結果以下:

  雙擊table1,能夠圖形化顯示數據表:

  顯示結果以下:

 

四,python操做MySQL

  具體請參考博文:Python:python操做MySQL

  在Python環境下的操做,咱們必然是經過寫Python代碼的方式。可是Python和數據庫語言SQL是兩碼事,它根本沒法操做數據庫,不要緊,咱們能夠在Python代碼中嵌入SQL語句,好比下面的方式:

# 建立鏈接,這裏先忽略建立方法
conn = ......
# 建立遊標
cursor = conn.cursor()
 
# 執行SQL,並返回收影響行數
effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');")
 
# 提交,否則沒法保存新建或者修改的數據
conn.commit()
 
# 關閉遊標
cursor.close()
# 關閉鏈接
conn.close()

  因此問題來了,python如何建立和數據庫的連接呢?這裏咱們使用pymysql這一類的第三方模塊(針對不一樣的數據庫,有不一樣的模塊),因而咱們有下面的連接:

conn = pymysql.connect(host='137.78.5.130', port=3306, user='root',
 passwd='123456', db='test')

  大多數程序員不是專業的DBA,因此SQL寫的很爛也正常,那麼出錯問題如何解決呢?

  Python語法能夠解決這個問題,咱們使用Python語法來寫,而後使用一箇中間工具將Python代碼翻譯成原生的SQL語句,而這個中間工具就是所謂的ORM(對象關係映射)!

  ORM將一個Python的對象映射爲數據庫中的一張關係表。它將SQL封裝起來,程序員再也不須要關心數據庫的具體操做,只須要專一於本身自己的代碼和業務邏輯的實現。

  因而總體的流程就是:Python代碼,經過ORM轉換成SQL語句,再經過pymysql去實際操做數據庫。

  Django自帶ORM系統,不須要額外的安裝別的ORM。固然也能夠安裝並使用其餘的ORM,好比SQLAlchemy。可是不建議這麼作,由於Django系統龐大,集成完善,模型層與視圖層,模板層結合的比較緊密。

 

五,django.db.utils.ProgrammingError: (1146, u"Table'' doesn't exist")解決辦法

5.1  現象

  在數據庫中刪除了一張表,從新執行python  manage.py migrate 時報錯,提示不存在這張表

5.2  緣由

  主要是由於Django通常在第一次遷移的時候新建表,後面都不會新建表,而是隻檢查字段等等的變化,因此咱們既然已經刪除了這張表,django檢查這張表的字段變化的時候天然報錯了。

5.3  解決方法

  解決方法仍然是執行數據庫遷移命令

python manage.py  makemigrations

python manage.py  migrate

  只不過在執行上面代碼以前,把第一次執行遷移建立的那個記錄刪除掉,不然它檢查到已經執行過第一次了,那麼它後面就不會建立表了。

  在該APP模塊下,有一個migtations文件夾,除了前兩個文件外,其餘的文件都刪除,其實每一次若是有變化的話,這邊就會生成一個文件,下面的這個001_initial.py看名字就知道是第一次遷移的時候生成的,也就是由於有它的存在,因此之後每次再執行就再也不建立表了。

  其次,在數據庫裏面也有相應的記錄,也要刪除。咱們仔細看看數據庫裏面存的是什麼,在Django_migrations裏面,這表裏面存的都是每次遷移的記錄,固然記錄的是什麼模塊以及對應的文件名字,好比咱們這裏的模塊是dtheme,這裏的文件名叫作001_initial,和咱們文件夾裏面是一一對應的,一樣,刪除這條記錄。

  而後在執行數據庫遷移命令便可。

  注意:若是這個APP模塊下面還有其餘的model的話,那麼其餘的model建立的表也要刪除掉,至關於咱們這樣的解決方案是針對整個APP模塊的,要執行就會所有從新生成,否則會提示部分表已經存在錯誤。

六,其餘django命令行操做命令

1,清空數據庫

python manage.py  flush

  

2,查詢某個命令的詳細信息

django-admin.py  help  startapp 

       admin 是Django 自帶的一個後臺數據庫管理系統。

  此時會進入django-admin的內容區:

#!c:\programdata\anaconda3\python.exe
from django.core import management

if __name__ == "__main__":
    management.execute_from_command_line()

  

3,啓動交互界面 

python manage.py  shell

     這個命令和直接運行 python 進入 shell 的區別是:你能夠在這個 shell 裏面調用當前項目的 models.py 中的 API,對於操做數據,還有一些小測試很是方便。

 

4,忘記命令時,能夠這樣操做

  終端上輸入python manage.py 能夠看到詳細的列表,在忘記子名稱的時候特別有用

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth]
    changepassword
    createsuperuser

[contenttypes]
    remove_stale_contenttypes

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

[sessions]
    clearsessions

[staticfiles]
    collectstatic
    findstatic
    runserver

  

5,修改語言

  在主程序的settings.py裏面查找語言編碼,默認是英文的,這裏能夠修改成中文,此處修改針對的是admin的頁面。

LANGUAGE_CODE = 'en-us'# 默認
LANGUAGE_CODE = 'zh-hans'# 改成中文,主要針對admin頁面

  

6,配置模板路徑

  在項目根目錄下添加templates文件夾。

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )
#而後在項目根目錄下添加templates文件夾

  

六,報錯出現django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2

1,問題描述

  使用Python3.6+django2.2+pymysql的時候出現這個問題:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2

  據瞭解,這主要是django2.2內部的一個版本限制在做怪。

2,處理方案

  修復源碼,由於django2.2和pymysql版本不匹配,因此mysqldb不支持python3.。那麼咱們能夠註銷掉下面這句話。

if version < (1, 3, 13):           
    raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ %Database.version)   

  這段話通常在Python的下面目錄:C:\Python37\Lib\site-packages\django\db\backends\mysql(python安裝目錄)打開base.py,註釋掉。

  而後在C:\Python37\lib\site-packages\django\db\backends\mysql\operations.py 的146行將下面代碼的decode修改成encode。

  由於字符串沒有decode。

query = query.decode(errors=‘replace’)

  

 

參考文獻:https://blog.csdn.net/weixin_45476498/article/details/100098297

原文出處:https://www.cnblogs.com/wj-1314/p/8082421.html

相關文章
相關標籤/搜索