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