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!")



猜你喜欢

转载自blog.csdn.net/oliver_hong/article/details/79692838