我8月份的时候接触Django几天,一个月后再打开未完工项目发现又是一头雾水,文档确实很详细,但是对于我来说,一大片的文字很是头疼,于是记录一下我自己的学习过程。如有错误,敬请指出。
开始
环境
Python 3.7.2
Django 2.2.5
从看到后台管理界面开始
使用pycharm的专业版很快能够新建一个初始化的项目。
然后点击绿色三角形,just运行。
打开,你会看到一个欢迎界面:
当我们想看到后台管理系统,试图访问http://127.0.0.1:8000/admin 却显示错误的时候,其实是我们还没有默认的用户表,也没有管理员的账号密码信息
python manage.py migrate # 初始化默认表信息 python manage.py createsuperuser # 创建后台管理员账号
我们再访问http://127.0.0.1:8000/admin 可以看到正常的后台管理页面了!输入账号密码,就可以看到一个“简陋”的后台,一个简单的后台是不是如此简单!是不是很兴奋。
使用simpleui开源项目一键美化界面
只需两步:
- 设置文件中包括该项目
setting.py
INSTALLED_APPS = [ 'simpleui', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... ] STATIC_ROOT = os.path.join(BASE_DIR, "static")
- pip3安装
pip3 install django-simpleui # 安装命令 python3 manage.py collectstatic #将框架静态文件拷贝项目目录的static目录
然后重新编译运行一下,再打开后台看一下。
对了,可以在setting.py里面将语言设置为中文:
LANGUAGE_CODE = "zh-hans"
深入
创建一个自己的表
- 在进行这一步之前,我们需要先新建一个模块。
这很容易理解,一个应用/系统按照功能需要划分成一个或多个模块。
我先新建一个usermanager一个模块:
python manage.py startapp usermanager
会发现项目中多一个名称为usermanaage文件夹。
我们稍后再去具体介绍这个项目结构。
- 我们还需要在setting.py文件中将该模块包括进来
INSTALLED_APPS = [ 'simpleui', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'usermanager.apps.UsermanagerConfig'# 包括进来 ]
- 定义并创建表
在该文件夹下面有usermanager/models.py
文件,这个文件用来定义这个模块所需要的所有表信息(一个或多个)。每个表都是使用一个类来定义的。
from django.db import models # Create your models here. class User(models.Model): id = models.AutoField(primary_key=True) qq = models.IntegerField(verbose_name="QQ号码") password = models.CharField(verbose_name="密码", max_length=100) class UserDomains(models.Model): id = models.AutoField(primary_key=True) userid = models.ForeignKey(User, on_delete=models.SET_NULL, blank=False, null=True, verbose_name='用户') domain = models.CharField(verbose_name="域名", max_length=100) remark = models.TextField(verbose_name="备注信息")
上面我简单定义了两个表:user和与user管理的domains表。
在命令台中,执行下面命令
python manage.py makemigrations usermanager # 为你的usermanage项目生成迁移文件(Python代码) python manage.py sqlmigrate usermanager 0001 # 根据迁移文件生成sql代码 python manage.py migrate # 未整个项目进行是数据库迁移,这一步才是真正修改数据库的
执行第一条命令会在模块文件夹下的migration文件夹下生成一个以数字开头的迁移文件:
执行第二条命令会输出相应的sql语句:
hewro@hewrodeMacBook-Pro ~/PycharmProjects/haandsome_auth python manage.py sqlmigrate usermanager 0001 # 根据迁移文件生成sql代码 BEGIN; -- -- Create model User -- CREATE TABLE "usermanager_user" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "qq" integer NOT NULL, "password" varchar(100) NOT NULL); -- -- Create model UserDomains -- CREATE TABLE "usermanager_userdomains" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "domain" varchar(100) NOT NULL, "remark" text NOT NULL, "userid_id" integer NULL REFERENCES "usermanager_user" ("id") DEFERRABLE INITIALLY DEFERRED); CREATE INDEX "usermanager_userdomains_userid_id_9645d39d" ON "usermanager_userdomains" ("userid_id"); COMMIT;
执行第三条命令,是在数据库中建立了相应的表。
表默认是使用sqlite数据库,也就是项目文件夹下的db.sqlite3文件。
pycharm自带了数据库查看工具,可以直接连上。
用户表的名称是模块名_类名
。除此之外,一开始项目就初始化了很多表。
在后台管理界面显示该表的管理界面
我们可以在admin.py里面增加一行代码:
from django.contrib import admin # Register your models here. from usermanager.models import User, UserDomains admin.site.register(User) admin.site.register(UserDomains)
这表示,我们在后台管理界面注册了与该表相关的管理界面。(当然默认是很简陋的)
相关常用字段介绍
AutoField # 主键 ForeignKey # 外键 CharField # 字符串 TextField # 文本 IntegerField # 数字 DateTimeField # 日期
字段相关属性介绍
具体的函数实现如下:
def is_good(request): if request.method == "GET": domain = request.GET.get("domain") return_dict = {'domain': domain} status = 200 try: query = UserDomains.objects.get(domain=domain) query_user = User.objects.get(id=query.userid.id) user = { "qq": query_user.qq, "date": query_user.date } return_dict['user'] = user except UserDomains.DoesNotExist: status = 404 return json_response(status, "", return_dict)
操作数据库直接调用类的objects方法。
verbose_name # 中文名称 unique # 字段值是否唯一 default # 默认值 max_length # 最大长度
项目结构
- 第一个框是项目的配置文件夹
- setting.py 整个项目的配置基本都在这里
- urls.py 是项目整个接口定义文件
- 第二个框就是模块,每个模块都会有一个文件夹
- migration文件夹:这里面的文件就是models.py 里面的数据库迁移文件,每修改并执行一次
makemigrations
命令,都会增加一个文件 - admin.py:后台管理界面
- app.py:模块定义文件
- views.py:接口具体实现文件
写一个简单的json接口
除了后台管理,我们可能还需要定义一些自定义接口,以便外部调用。
这个接口返回数据可能是html代码(视图),也可能是json数据。
实现一个简单接口只需要两步。
- 实现接口实现函数
为了让json返回数据更标准,我一般使用一个工具类来格式化需要返回的数据。
项目目录中新建common
目录,新建utils.py
:
from django.http import JsonResponse def json_response(status, msg, data=None): if data is None: data = [] resp = dict( meta=dict( status=status, msg=msg, ), data=data ) print(JsonResponse(resp)) return JsonResponse(resp)
在模块的views.py(usermanager/views.py):
# Create your views here. from common.utils import json_response def hello(request): return json_response(200,"hello word",[])
- 在urls.py中进行接口定义
至于定义接口,我们有两种方式
- 直接在项目的urls.py里面定义
- 在模块下面新建一个
urls.py
,然后在项目的urls.py
里面引入这个文件
我们选择第二种方式。
在usermanager/urls.py 文件中:
from django.urls import path from . import views # 定义接口 urlpatterns = [ path('hello', views.hello), ]
在项目配置文件夹下面的haandsome_auth/urls.py:
urlpatterns = [ path('admin/', admin.site.urls), path('user/', include('usermanager.urls')), ]
至此一个简单的接口实现成功:http://127.0.0.1:8000/user/hello
操纵数据库
更常见的是在实现接口函数的时候需要调用数据库。Django实现一种非常简单的方式。
比如,接口请求中包含一个域名地址参数,我们调用该接口,判断该域名是否存在数据库中。
常用方法如下:
# 查询 .get() #返回一条记录queryset .filter() # 返回符合条件的queryset的列表 ## 查询条件的写法就是写在函数参数里,可以接收多个条件,可以多次链式调用 # 修改 ## 方法一:(get,filter都适用) user=User.objects.get(id=1) user.qq="4444444" user.save() ## 方法二(只适用filter方法) users = User.objects.filter(id=1) users[0].update(qq="44444") # 删除 ## 先查询再删除 queryset.delete() # 增加 b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') b.save()
上述代码还涉及到从get请求中获取参数,一看代码便知。同理POST
请求的方法也是类似的,将GET
换成POST
即可。