Django笔记

Posted by saltyfishyjk on 2022-08-13
Words 2.2k and Reading Time 9 Minutes
Viewed Times

Django笔记

Django是由Python编写的开源Web应用框架,Python+Django+Vue是网站开发与部署的常见组合。

重要的参考资料:

Part 0 版本与兼容

参考资料:Django版本选择、Python兼容问题及更新时间(长期更新)

选择合适的Django与Python对项目开发至关重要,上面博客详细列举了这方面的问题,在此不做赘述。

基于当前时间(2022.8),我们选择Django3.2+Python3.9进行开发。如果版本(特别是大版本号)不同,可能产生未知的错误。

  • 安装Django:

    1
    pip install Django==3.2

Part 1 创建Project与APP

考虑到Django项目目录的性质,我们以/代表项目容器目录(即最外层目录)

创建Project

1
django-admin startproject project_name

project_name替换为项目的名字。

创建APP

1
python manage.py startapp app_name

app_name替换为app的名字

测试服务运行

只允许本机连接

1
python manage.py runserver

允许其他电脑连接

  1. settings.py中设置ALLOWED_HOSTS = ['*']
  2. python manage.py runserver 0.0.0.0:8000

配置settings.py

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp' # 添加自己的app
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR + "/templates",],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

path()函数

Django2. 0中可以使用 re_path() 方法来兼容 1.x 版本中的 url() 方法,一些正则表达式的规则也可以通过 re_path() 来实现 。

Part 2

视图——类视图与函数视图

类视图

1
path(..., ClassView.as_view(), ...)

函数视图

1
path(..., function_view, ...)

写一个简单的处理POST请求的视图

可以参考这篇博客

使用form-data接收信息并使用JsonResponse传回

参考:使用formdata在vue和django之间传递文件

笔者在数据库大作业时在Vue+Django的前后端连接上花了大量功夫,在这里简单记录。

一个示例函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@csrf_exempt
def mainRecommendGoods(request):
if request.method == 'POST':
# 获取用户名
id = request.POST.get('user_id')
# print("arrive here 1")
if id is None:
return JsonResponse({
'succeed': False,
'code': '050000',
'message': 'ERROR! Need non-null userid!'
})
user = Account.objects.get(id=id)
# print("arrive here 2")
if user is None:
return JsonResponse({
'succeed': False,
'code': '050001',
'message': 'ERROR! Need available userid!'
})
# goods = Good.objects.all()
goods = getMainRecommandGoods(id)
# n = goods.count()
n = len(goods)
ret_json = {'succeed': True,
'code': '050101',
'message': 'SUCCESS! Get goods recommended successfully!',
'n': n}
goods_json = []
for good in goods:
# like = 0
# stars = Star.objects.filter(user_id=id, good_id=good.id)
# if stars.count() == 1:
# star = Star.objects.get(user_id=id, good_id=good.id)
# like = star.like
good_json = {
'id': good.id,
'name': good.name,
'price': good.price,
'seller_id': good.seller_id,
'seller_name': Account.objects.get(id=good.seller_id).name,
'maker': good.maker,
'picture': good.picture,
'description': good.description,
'date': good.date,
'shelf_life': good.shelf_life,
'like': good.like
}
goods_json.append(good_json)
ret_json['goods'] = goods_json
return JsonResponse(ret_json)

从该示例中可以看出,对发送方式的要求为POST,获取form-data传送的信息的方法是形如request.POST.get('user_id'),传回JsonResponse形如用一个json生成一个JsonResponse对象。注意,这里不要使用HttpResponse,否则会把传回信息写在Header中而难以被读取。

Part 3 数据库

参考文章

连接MySQL数据库

这里不介绍MySQL数据库本身的安装与配置(后续会在其他博客更新如果没咕咕咕的话),本部分只介绍在Django中连接配置好的MySQL数据库。

Step 1 填写/project_name/settings.py配置文件

1
2
3
4
5
6
7
8
9
10
11
DATABASES = { 
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}

Step 2 填写/project_name/__init__.py初始化文件

通过填写初始化文件,告诉Django使用pymysql模块连接MySQL:

1
2
import pymysql
pymysql.install_as_MySQLdb()

如果你没有安装过pymysql,需要使用pip或conda或其他工具先行安装

创建表与新增表

创建表

参考博客:Django 模型-菜鸟教程

Step 1 创建APP(应用)

在Django中,要使用模型,必须创建一个app(应用),推荐切换到manage.py所在目录并使用如下命令创建一个app:

1
python manage.py satrtapp app_name

推荐上述方式的具体原因可以参考这篇文档;简单而言,这样做可以充分利用Django提供的可插拔特性,更重要地,你可以因此避免很多无谓的bug(比如难以在settings.py中的INSTALLED_APPS中进行正确而合适的配置)。

如果您执意不按照上述操作,那么您也可以在任意目录使用如下命令,但这极不推荐(后续内容都仅基于第一种创建APP的方式)

1
django-admin startapp app_name
Step 2 创建表格模型

修改/app_name/models.py,添加要创建的数据库表类

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
class TableDoc(models.Model):
document_id = models.AutoField(primary_key=True)
title = models.CharField(max_length=128)
content = models.TextField(max_length=32768)
create_time = models.DateField(auto_now_add=True)

class TablePassage(models.Model):
passage_id = models.AutoField(primary_key=True)
document_id = models.IntegerField()
title = models.CharField(max_length=128)
content = models.TextField(max_length=32768)
create_time = models.DateField(auto_now_add=True)

在上例中,我们设计了两张表,名字分别为TableDocTablePassage,并设计了若干列。其中,具体的字段写法可以参考Django文档-模型字段参考

Step 3 添加INSTALLED_APPS

/project_name/settings.py中添加APP配置

e.g.

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_name.apps.App_nameConfig'
]
Step 4 在Django框架中创建表结构

以下指令在项目目录下执行

1
2
python manage.py makemigrations # 记录对models.py的改动
python manage.py migrate # 创建表结构

按照上述流程,预期效果如下:

如果有误操作导致产生了难以解决的问题,在条件允许的情况下重新创建APP是更好的选择

新增表 [待补全]

参考资料:Django更新models数据库结构

根据目前笔者查到的资料,暂时没有比较好且简单的办法能够在不影响数据库已有数据的情况下新增一张表,如果数据规模不大,可以采用如下办法:

Step 1
1
python manage.py makemigrations --empty app_name
Step 2
1
python manage.py makemigrations
Step 3
1
python

此部分未完成,待填坑

增删改查

在Django框架中,对数据库操作提供了良好的封装(相较于pymysql而言),增删改查变得更加OO和python。

接下来的内容中,我们以上文中创建表的例子(TableDoc, TablePassage)继续展示。

1
2
3
4
5
6
from HangLvDataV2.models import TablePassage
document_id = 1
title = "a new title"
content = "new content"
passage_obj = TablePassage(document_id=document_id, title=title, content=content) # 创建新TablePassage对象
passage_obj.save() # 保存到数据库

1
2
3
from HangLvDataV2.models import TablePassage
passage_obj = TablePassage.objects.get(id = 1)
passage_obj.delete()

1
2
3
4
5
6
7
8
9
from HangLvDataV2.models import TableDoc
# 方法一
doc = TableDoc.get(document_id = 1) # 相当于SQL查询,doc为TableDoc对象
doc.title = "new_title" # 修改内容
doc.save() # 保存上传
# 方法二
TableDoc.objects.filter(id = 1).update(name = "new_title") # filter为过滤器
# 方法三
TableDoc.objects.update(name = "new_title") # 没有过滤器,所以对所有对象操作

获取全部数据
1
2
3
4
from HangLvDataV2.models import TableDoc
# objects是模型管理器,all()返回了所有数据行,某种程度上相当于SQL中的SELECT * FROM
# 其中,ls是一个列表,其中每一个元素是TableDoc对象,这是比pymysql更优雅的地方
ls = TableDoc.objects.all()
按条件获取数据
1
2
3
from HangLvDataV2.models import TableDoc

ls = TableDoc.objects.get(id = 1)

Part4 单独运行.py与调试

在Django中,我们可能会想在上线前写一些简单代码测试运行效果,直接python code_name.py会报错,以下介绍正确方式。

这里介绍的方法适用于Linux服务器,网络上也有一些介绍PyCharm的设置

参考文章:在django项目中单独运行某个python文件

Step 1 引入os, django, sys

首先寻找项目根目录

1
2
3
4
5
6
7
8
9
10
11
import django
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(BASE_DIR)


os.environ.setdefault('DJANGO_SETTINGS_MODULE','project_name.settings')
# 其中project_name是你的项目名
django.setup()

Step 2 引入模型

以数据库模型为例,当我们需要测试/使用模型时,按照Django代码的方式引用即可。

1
2
3
4
5
6
from HangLvDataV2.models import TableDoc
from HangLvDataV2.models import TablePassage

"""
CODE HERE
"""

Step 3 运行与调试

前面两步完成后,即可按照常规的python code_name.py来运行程序。

Part 5 字段

模型中最重要且唯一必要的是数据库的字段定义。字段在类属性中定义。

字段类型

模型中每一个字段都是某个Field类的实例,在字段类型参考中可以查找

DateTimeField


This is copyright.