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 #導入數據
manage.py flush
returns the database to the state it was in immediately after syncdb was executedmanage.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名字applicationINSTALLED_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!")