前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【django开发】知识经验总结共50页md文档。今日分享:django配置和数据库操作详解

【django开发】知识经验总结共50页md文档。今日分享:django配置和数据库操作详解

原创
作者头像
程序员一诺
发布2023-11-08 21:03:38
1980
发布2023-11-08 21:03:38
举报
文章被收录于专栏:知识集合知识集合
Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则

全套Django笔记直接地址: 请移步这里


共 4 大章,47 子模块,总计2.3w字


配置和静态文件

配置文件

1. BASE_DIR

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))

当前工程的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径。

2. DEBUG

调试模式,创建工程后初始值为 True ,即默认工作在调试模式下。

作用:

  • 修改代码文件,程序自动重启
  • Django程序出现异常时,向前端显示详细的错误追踪信息,例如
  • 而非调试模式下,仅返回Server Error (500)

注 意:部署线上运行的Django不要运行在调式模式下,记得修改DEBUG=False和ALLOW_HOSTS。

3. 本地语言与时区

Django支持本地化处理,即显示语言与时区支持本地化。

本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化,中国大陆地区使用 简 体中文,时区使用 洲/上海时区,注意这里不使用北京时区表示。

初始化的工程默认语言和时区为英语和UTC标准时区

LANGUAGE_CODE = 'en-us' # 语言 TIME_ZONE = 'UTC' # 时区# 时区

将语言和时区修改为中国大陆信息

LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'

静态文件

项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。

为了提供静态文件,需要配置两个参数:

  • STATICFILES_DIRS 存放查找静态文件的目录
  • STATIC_URL 访问静态文件的URL前缀

示例

1) 在项目根目录下创建static目录来保存静态文件。

2) 在bookmanager/settings.py中修改静态文件的两个参数为

STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]

3)此时在static添加的任何静态文件都可以使用网址 /static/ 文件在static中的路径来访问了。

例如,我们向static目录中添加一个index.html文件,在浏览器中就可以使用127.0.0.1:8000/static/index.html来访问。

或者我们在static目录中添加了一个子目录和文件book/detail.html,在浏览器中就可以使用127.0.0.1:8000/static/book/detail.html来访问。

App应用配置

在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。

在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如

from django.apps import AppConfig

class BookConfig(AppConfig): name = 'book'

我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。

  • AppConfig.name 属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。
  • AppConfig.verbose_name 属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示,如 from django.apps import AppConfig class UsersConfig(AppConfig): name = 'book' verbose_name = '图书管理'

模型

重点

  • 模 型配置
  • 数 据的增删改
    • 增:book = BookInfo() book.save()BookInfo.objects.create()
    • 删:book.delete()BookInfo.objects.get().delete()
    • 改:book.name='xxx' book.save()BookInfo.objects.get().update(name=xxx)
  • 数 据的查询
    • 基础查询
    • F对象和Q对象
    • 关联查询
    • 查询集QuerySet
MVT图解

项目准备

1.创建项目

  • django-admin startproject bookmanager
  • 2.创建应用 python manager.py startapp book
  • 3.更换python解释器:按需选择
代码语言:javascript
复制
# 进入指定虚拟环境
which python
# python2
/home/python/.virtualenvs/py_django/bin/python
# python3
/home/python/.virtualenvs/py3_django/bin/python
  • 4.安装应用
代码语言:javascript
复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #添加子应用
    'book.apps.BookConfig'
]
  • 5.本地化
代码语言:javascript
复制
#设置中文
LANGUAGE_CODE = 'zh-Hans'
#亚洲上海时区
TIME_ZONE = 'Asia/Shanghai'
  • 6.模板路径
    • 在应用同级目录下,创建templates模板文件夹 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(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', ], }, }, ]
  • 7.项目中匹配urls
    • 正则 : 路径只要不是admin/就算匹配成功。并包含到应用中的urls.py from django.conf.urls import url,include from django.contrib import admin ? urlpatterns = [ url(r'^admin/', admin.site.urls), #正则为:只要不是 admin/ 就算匹配成功 url(r'^',include('book.urls')) ]
  • 8.应用中匹配urls.py
    • 应用中创建 urls.py
    • 正则 : 路径中包含booklist/,就调用视图中对应的bookList函数 from django.conf.urls import url from book.views import bookList ? urlpatterns = [ # 匹配书籍列表信息的URL,调用对应的bookList视图 url(r'^booklist/$',bookList) ]
  • 9.准备视图
代码语言:javascript
复制
    # 定义视图:提供书籍列表信息
    def bookList(request):
        return HttpResponse('OK!')
  • 10.开启服务器, 测试项目
代码语言:javascript
复制
# 进入项目文件中, 开启项目对应的服务器
python manage.py runserver
# 浏览器中输入网址
http://127.0.0.1:8000/booklist/

配置

在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用 sqlite 数据库。

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

  1. 使用 MySQL 数据库首先需要安装驱动程序 pip install PyMySQL
  2. 在Django的工程同名子目录的init.py文件中添加如下语句 import pymysql
代码语言:javascript
复制
pymysql.install_as_MySQLdb()

作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。

  1. 修改 DATABASES 配置信息
代码语言:javascript
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'mysql',  # 数据库用户密码
        'NAME': 'book'  # 数据库名字
    }
}
  1. 在MySQL中创建数据库 create database book charset=utf8;

模型

重点

  • 模 型配置
  • 数 据的增删改
    • 增:book = BookInfo() book.save()BookInfo.objects.create()
    • 删:book.delete()BookInfo.objects.get().delete()
    • 改:book.name='xxx' book.save()BookInfo.objects.get().update(name=xxx)
  • 数 据的查询
    • 基础查询
    • F对象和Q对象
    • 关联查询
    • 查询集QuerySet

定义模型类

  • 模型类被定义在"应用/models.py"文件中。
  • 模型类必须继承自Model类,位于包django.db.models中。

接下来首先以"图书-人物"管理为例进行演示。

1 定义

在models.py 文件中定义模型类。

代码语言:javascript
复制
from django.db import models
# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=20, verbose_name='名称')
    pub_date = models.DateField(verbose_name='发布日期',null=True)
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
?
    class Meta:
        db_table = 'bookinfo'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
?
    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.name
        # 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    GENDER_CHOICES = (
    (0, 'male'),
    (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
?
    class Meta:
    db_table = 'peopleinfo'
    verbose_name = '人物信息'
?
    def __str__(self):
    return self.name

1 ) 数据库表名

模型类如果未指明表名,Django默认以 小 写app应用名_小写模型类名为数据库表名。

可通过 db_table 指明数据库表名。

2 ) 关于主键

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

3 ) 属性命名限制

  • 不能是python的保留关键字。
  • 不允许使用连续的下划线,这是由django的查询方式决定的。
  • 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下: 属性=models.字段类型(选项)

4 )字段类型

类型

说明

AutoField

自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性

BooleanField

布尔字段,值为True或False

NullBooleanField

支持Null、True、False三种值

CharField

字符串,参数max_length表示最大字符个数

TextField

大文本字段,一般超过4000个字符时使用

IntegerField

整数

DecimalField

十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数

FloatField

浮点数

DateField

日期,

参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False;

参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False;

参数auto_now_add和auto_now是相互排斥的,组合将会发生错误

TimeField

时间,参数同DateField

DateTimeField

日期时间,参数同DateField

FileField

上传文件字段

ImageField

继承于FileField,对上传的内容进行校验,确保是有效的图片

5 ) 选项

选项

说明

null

如果为True,表示允许为空,默认值是False

blank

如果为True,则该字段允许为空白,默认值是False

db_column

字段的名称,如果未指定,则使用属性的名称

db_index

若值为True, 则在表中会为此字段创建索引,默认值是False

default

默认

primary_key

若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用

unique

如果为True, 这个字段在表中必须有唯一值,默认值是False

null 是数据库范畴的概念,blank是表单验证范畴的

6 ) 外键

在设置外键时,需要通过 on_delete 选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

  • CASCADE 级联,删除主表数据时连通一起删除外键表中数据
  • PROTECT 保护,通过抛出 ProtectedError 异常,来阻止删除主表中被外键应用的数据
  • SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
  • SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
  • SET() 设置为特定值或者调用特定方法
  • DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项会抛出 IntegrityError 异常

2 迁移

将模型类同步到数据库中。

1 )生成迁移文件

代码语言:javascript
复制
python manage.py makemigrations

2 )同步到数据库中

代码语言:javascript
复制
python manage.py migrate

3 添加测试数据

代码语言:javascript
复制
insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);

?

代码语言:javascript
复制
insert into peopleinfo(name, gender, book_id, description, is_delete)  values
    ('郭靖', 1, 1, '降龙十八掌', 0),
    ('黄蓉', 0, 1, '打狗棍法', 0),
    ('黄药师', 1, 1, '弹指神通', 0),
    ('欧阳锋', 1, 1, '蛤蟆功', 0),
    ('梅超风', 0, 1, '九阴白骨爪', 0),
    ('乔峰', 1, 2, '降龙十八掌', 0),
    ('段誉', 1, 2, '六脉神剑', 0),
    ('虚竹', 1, 2, '天山六阳掌', 0),
    ('王语嫣', 0, 2, '神仙姐姐', 0),
    ('令狐冲', 1, 3, '独孤九剑', 0),
    ('任盈盈', 0, 3, '弹琴', 0),
    ('岳不群', 1, 3, '华山剑法', 0),
    ('东方不败', 0, 3, '葵花宝典', 0),
    ('胡斐', 1, 4, '胡家刀法', 0),
    ('苗若兰', 0, 4, '黄衣', 0),
    ('程灵素', 0, 4, '医术', 0),
    ('袁紫衣', 0, 4, '六合拳', 0);

shell工具和查看MySQL数据库日志

1 shell工具

Django的manage工具提供了 shell 命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。

通过如下命令进入shell

代码语言:javascript
复制
python manage.py shell

导入两个模型类,以便后续使用

代码语言:javascript
复制
from book.models import BookInfo,PeopleInfo

2 查看MySQL数据库日志

查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:

代码语言:javascript
复制
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

把68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。

代码语言:javascript
复制
sudo service mysql restart

使用如下命令打开mysql日志文件。

代码语言:javascript
复制
tail -f /var/log/mysql/mysql.log  # 可以实时查看数据库的日志内容
# 如提示需要sudo权限,执行
# sudo tail -f /var/log/mysql/mysql.log

数据库操作-增、删、改

1 增加

增加数据有两种方法。

1 )save

通过创建模型类对象,执行对象的save()方法保存到数据库中。

代码语言:javascript
复制
>>> from book.models import BookInfo,PeopleInfo
>>> book = BookInfo(
...         name='python入门',
...         pub_date='2010-1-1'
...     )
>>> book.save()
>>> book
<BookInfo: python入门>

2 )create

通过模型类.objects.create()保存。

代码语言:javascript
复制
>>> PeopleInfo.objects.create(
...         name='itheima',
...         book=book
...     )
<PeopleInfo: itheima>

2 修改

修改更新有两种方法

1 )save

修 改模型类对象的属性,然后执行save()方法

代码语言:javascript
复制
>>> person = PeopleInfo.objects.get(name='itheima')
>>> person.name = 'itcast'
>>> person.save()
>>> person
<PeopleInfo: itcast>

2 )update

使 用模型类.objects.filter().update(),会返回受影响的行数

代码语言:javascript
复制
>>> PeopleInfo.objects.filter(name='itcast').update(name='传智播客')
1

3 删除

删除有两种方法

1 )模型类对象delete

代码语言:javascript
复制
>>> person = PeopleInfo.objects.get(name='传智播客')
>>> person.delete()
(1, {'book.PeopleInfo': 1})

2 )模型类.objects.filter().delete()

代码语言:javascript
复制
>>> BookInfo.objects.filter(name='python入门').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})

数据库操作-查询

未完待续 下一期下一章

完整笔记请看文章开头

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 全套Django笔记直接地址: 请移步这里
    • 共 4 大章,47 子模块,总计2.3w字
    • 配置和静态文件
    • 配置文件
      • 1. BASE_DIR
        • 2. DEBUG
          • 3. 本地语言与时区
          • 静态文件
            • 示例
            • App应用配置
            • 模型
              • 重点
              • 项目准备
              • 配置
              • 模型
                • 重点
                • 定义模型类
                  • 1 定义
                    • 2 迁移
                      • 3 添加测试数据
                        • shell工具和查看MySQL数据库日志
                          • 1 shell工具
                            • 2 查看MySQL数据库日志
                            • 数据库操作-增、删、改
                              • 1 增加
                                • 2 修改
                                  • 3 删除
                                  • 数据库操作-查询
                                    • 未完待续 下一期下一章
                                    • 完整笔记请看文章开头
                                    相关产品与服务
                                    数据库
                                    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                                    http://www.vxiaotou.com