Django全流程教程

1. Django安裝

win cmd:   pip install django

        這時在path_to\python3.6\lib\site-packages 中會有一個Django文件夾。在這裏是Django-2.0.3.dist-info

        檢測是否安裝好:python shell 下

>>> import django
>>> django.get_version()

2. 創建Django項目

        在任意目錄下win cmd輸入以下代碼,會在當前目錄下新建一個projName文件夾

django-admin startproject projName

3. 新建一個app

        在project根目錄下輸入以下代碼,會在當前目錄下新建一個app文件夾

python manage.py startapp appname

4. 創建schema並創建數據表

        4.1.1 在新建的app文件的models.py創建數據庫schema

from django.db import models
class movie(models.Model):
    budget = models.IntegerField(null = True,blank=True)#,blank=True
    id = models.IntegerField(primary_key=True)
    imdb_id = models.CharField(max_length = 20,null = True,blank=True)
    original_language = models.CharField(max_length = 10,null = True,blank=True)
    popularity = models.FloatField(null = True,blank=True)
    release_date = models.CharField(max_length = 15,null = True,blank=True)
    revenue = models.IntegerField(null = True,blank=True)
    runtime = models.IntegerField(null = True,blank=True)
    status = models.CharField(max_length = 10,null = True,blank=True)
    title = models.CharField(default="",max_length = 30)
    video = models.CharField(max_length = 6,null = True,blank=True)
    vote_average = models.FloatField(null = True,blank=True)
    vote_count =  models.IntegerField(null = True,blank=True)

        4.1.2 設置多主鍵/外鍵的方法。

class Hop(models.Model):
    migration = models.ForeignKey('Migration')    #外鍵參考的必須是另外一個table或者是其名字,或者是"self"
    host = models.ForeignKey(User, related_name='host_set')   #多attr參照同一個表格的時候需要用不同的related_name

    class Meta:
        unique_together = (("migration", "host"),)

          關於域和屬性的詳解:https://www.cnblogs.com/kuku0223/p/7827345.html

          之後在proj文件下輸入代碼創建sqlite(默認爲sqlite,可改爲mysql等)數據表

python manage.py makemigrations
python manage.py migrate

        -- 這個時候可以使用sql語言操作數據表

python manage.py dbshell (退出用.exit)

        -- 也可以查看所有的數據表

python manage.py shell
from django.db import connection
tables = connection.introspection.table_names()
seen_models = connection.introspection.installed_models(tables)

        每次數據庫schema有變化的時候都需要

python manage.py makemigrations
python manage.py migrate

        (PS有可能會遇到migrate之後依然沒有建立相應表,這個時候可以在app的文件夾下的migrations文件夾中刪除相應的操作記錄,然後重新建表)

        --其他可能有用的操作

python manage.py migrate --run-syncdb
python manage.py migrate --fake APPNAME zero
#如果在migrate的時候報錯:*** table already exist, 目前嘗試過的一種較笨的解決辦法是在dbshell下刪除所有衝突的表格
python manage.py dumpdata appname > appname.json #導出數據
python manage.py loaddata appname.json #導入數據
python manage.py sqlclear  will print the sql statement to drop all tables  #注意高版本可能已經刪除這條命令
manage.py flush returns the database to the state it was in immediately after syncdb was executed
manage.py syncdb Creates the database tables for all apps in INSTALLED_APPS whose tables have not already been created.

5. 在app文件夾下的views.py中寫入response函數

def index(request):  #渲染網頁
	return render(request,'index.html')
def register(request):
	email = request.GET.get("email","")
	pw = request.GET.get("pw","")   #獲取參數,默認值爲""
	if email and pw:
		if(len(pw) < 4):
			return HttpResponse("pwTooShort")
		from testapp.models import user
		user.objects.create(email = email, pw = pw)    #創建一個table的新instance
		return HttpResponse("true")

       返回json:

方法一
from django.http import JsonResponse

def some_view(request):
    data = list(SomeModel.objects.filter(attr__contains = "a").values())
    return JsonResponse(data, safe=False)  # or JsonResponse({'data': data})
方法二:
from django.core import serializers
from django.http import HttpResponse

def some_view(request):
    qs = SomeModel.objects.all()
    qs_json = serializers.serialize('json', qs)
    return HttpResponse(qs_json, content_type='application/json')

     在project/projectname文件夾下設置對應的url

from application import views as app

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',app.index),        
    path('login/',app.login),   # ..app.函數名    使得../login/..的域名會激活views.login函數
    path('register/',app.register),
]
        同時在settings.py中加上app名字application
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'application'
]
6. 服務器run起來
python manage.py runserver

7. 其他SQL操作

Person.objects.all()
Person.objects.all()[:10] 切片操作,獲取10個人,不支持負索引,切片可以節約內存
Person.objects.get(name=name)	# 查詢單條數據
P.objects.filter(name__contains=name)  # 模糊查詢;name爲查詢的字段名
P.objects.all().delete() # 刪除表中全部數據
P.objects.get(aa='test').delete() # 刪除一條aa等於'test'的數據
P.objects.filter(aa='123').delete() #過濾出aa字段等於123的都刪除
P.objects.get(id=id).update(name=name)  #改
data = Person.objects.get(name=name)[0];   data.attr   #提取attr值
data = Person.objects.get(name=name);   data[0].attr   #提取attr值

8. 批量導入json數據到table中

import django    #Django 版本大於等於1.7的時候,需要加上下面兩句
django.setup()    #否則會拋出錯誤 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Netfilm.settings")


import json
from application.models import rate as r

r.objects.all().delete()

with open("dataset/ratings_small.json",encoding = 'utf-8') as data:
	d = json.load(data)
	List = []

for i in range(0,len(d)):
	userId = d[i]["userId"]
	movieId = d[i]["movieId"]
	rating = d[i]["rating"]
	timestamp = d[i]["timestamp"]
	instance = r(userId = userId, movieId = movieId, rating =rating,timestamp =timestamp)
	List.append(instance)


r.objects.bulk_create(List)
print("Done!")



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章