我8月份的时候接触Django几天,一个月后再打开未完工项目发现又是一头雾水,文档确实很详细,但是对于我来说,一大片的文字很是头疼,于是记录一下我自己的学习过程。如有错误,敬请指出。
开始
环境
Python 3.7.2
Django 2.2.5
从看到后台管理界面开始
使用pycharm的专业版很快能够新建一个初始化的项目。
然后点击绿色三角形,just运行。
打开 http://127.0.0.1:8000/,你会看到一个欢迎界面:当我们想看到后台管理系统,试图访问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 # 日期
字段相关属性介绍
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实现一种非常简单的方式。
比如,接口请求中包含一个域名地址参数,我们调用该接口,判断该域名是否存在数据库中。
具体的函数实现如下:
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方法。详细文档可以看这里:执行查询 | Django 文档 | 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
即可。