我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实现一种非常简单的方式。

比如,接口请求中包含一个域名地址参数,我们调用该接口,判断该域名是否存在数据库中。

接口地址:

http://127.0.0.1:8000/user/is_good?domain=https://www.ihewro.com

具体的函数实现如下:

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方法。详细文档可以看这里:https://docs.djangoproject.com/zh-hans/2.2/topics/db/queries/

常用方法如下:

# 查询

.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即可。

最后修改:2021 年 12 月 31 日
喜欢我的文章吗?
别忘了点赞或赞赏,让我知道创作的路上有你陪伴。