Django關(guān)聯(lián)已有數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)表
兜兜轉(zhuǎn)轉(zhuǎn),發(fā)現(xiàn)自己還得用Python寫后端,無(wú)語(yǔ)。。。
在寫Django項(xiàng)目時(shí),一般是通過模型來(lái)創(chuàng)建表,以及通過ORM框架來(lái)實(shí)現(xiàn)數(shù)據(jù)的crud,現(xiàn)在的情況是,如果我們的數(shù)據(jù)表已經(jīng)存在了,如何引入到Django的項(xiàng)目中,方便我們實(shí)現(xiàn)ORM操作呢,記錄一下可行的方案
第一步,連接數(shù)據(jù)庫(kù)
如:我想連接我MySQL數(shù)據(jù)庫(kù)中的blog數(shù)據(jù)庫(kù),其中有兩張表是數(shù)據(jù)庫(kù)中本身就存在的表,分別是blog和category表,并非是通過Django創(chuàng)建的,如下圖:
需要在settings.py文件中寫入數(shù)據(jù)庫(kù)的信息,如下:
代碼:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 要連接的數(shù)據(jù)庫(kù)ip
'PORT': '3306', # 數(shù)據(jù)庫(kù)連接端口,一般默認(rèn)為3306
'NAME': 'blog', # 已經(jīng)存在的數(shù)據(jù)庫(kù)名稱
'USER': 'root', # 用戶名
'PASSWORD': 'xxxxx', # 用戶密碼
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
第二步,導(dǎo)入MySQL配置
在settings.py同級(jí)目錄的__init__.py文件中增加下面代碼,導(dǎo)入mysql的配置
代碼:
import pymysql
pymysql.install_as_MySQLdb()
如果沒有安裝pymysql可以先安裝一下,其實(shí)我并沒有驗(yàn)證這步是不是必須的,但確實(shí)成功了
第三步,導(dǎo)入數(shù)據(jù)表到Django項(xiàng)目中
終端執(zhí)行下面的命令
python manage.py inspectdb > models.py
執(zhí)行命令后,會(huì)在根目錄下自動(dòng)生成一個(gè)模型文件models.py
第四步,修改models.py文件
打開剛才生成的models.py文件,里面的代碼如下:
它會(huì)自動(dòng)生成與數(shù)據(jù)表相關(guān)的模型,但如果想在自己定義的app中使用的話,還不夠,需要自己去指定app名稱,就是我框出來(lái)的那段話,意思是這個(gè)模型是給app01這個(gè)應(yīng)用使用的,不然會(huì)報(bào)錯(cuò)
其實(shí)就是在模型的Meta類下添加app_label屬性,如下
app_label = 'app01'
這種方式不太符合邏輯,因?yàn)槲沂且趹?yīng)用中去寫模型,而不是模型中去綁定應(yīng)用,所以我推薦用下面這種做法
把自動(dòng)生成的models.py中自動(dòng)生成的代碼,拷貝到對(duì)應(yīng)app也就是app01中的models.py文件中,并統(tǒng)一做如下調(diào)整:
因?yàn)檫@個(gè)models.py就是app01的模型,所以無(wú)需寫app_label = ‘a(chǎn)pp01’
接下來(lái)就可以刪除自動(dòng)生成的models.py文件了
第五步,數(shù)據(jù)遷移
通用操作,終端執(zhí)行下面的代碼:
python manage.py migrate
第六步,視圖函數(shù)中應(yīng)用模型
如,我想獲取blog表中所有的數(shù)據(jù),在視圖函數(shù)中添加以下方法就行了
from django.http import JsonResponse
from django.shortcuts import render
# Create your views here.
from django.views.decorators.csrf import csrf_exempt
from .models import Blog
@csrf_exempt
def index(request):
if request.method == 'POST':
blogs = Blog.objects.all()
blog_data = [{'id': blog.id, 'title': blog.title, 'content': blog.content} for blog in blogs]
print(request.POST['name'])
return JsonResponse(blog_data, safe=False)
這段代碼是我上面pycharm截圖中右邊的文件,位置是app01的views.py文件中
有兩個(gè)注意點(diǎn):
-
@csrf_exempt
是為了解決跨域問題 -
return JsonResponse(blog_data, safe=False)
其中的safe=False必須寫,因?yàn)閎log_data是一個(gè)列表(或者叫數(shù)組,有點(diǎn)魔怔了,Python中叫列表,java和JavaScript叫數(shù)組),并非json格式的數(shù)據(jù),直接用JsonResponse返回會(huì)報(bào)錯(cuò),添加safe=False就是不去強(qiáng)行檢查返回的數(shù)據(jù)格式
正確配置路由后,就可以去postman測(cè)一下接口是不是通的了文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-804883.html
可以看到,接口正確返回了想要的數(shù)據(jù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-804883.html
到了這里,關(guān)于Django關(guān)聯(lián)已有數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!