Python-Django开发笔记

Django基础

虚拟环境选择

虚拟环境选择pipenv

pipenv的虚拟环境是和目录绑定的,不像conda的虚拟环境是可以直接通过conda env list查看所有虚拟环境并且随意分配的

  • 全局安装:pip install pipenv

创建虚拟环境

  • cd 到项目目录
  • 项目创建虚拟环境:在项目路径下 pipenv install 或者 pipenv shell(自动创建)

pipenv常用命令:

  • 进入:pipenv shell(若当前目录没有虚拟环境,会自动创建)
  • 退出虚拟环境:exit
  • 卸载包:pipenv uninstall xxx
  • 查看安装包的依赖关系: pipenv graph

Django安装,创建项目

  • pip install django 或者指定版本 pip install django==3.7.1
  • 验证是否安装成功:
    1. django-admin
    2. python -m django –version
  • 创建django项目:django-admin startproject mysite
  • cd到django项目目录,python manage.py runserver

Django目录介绍

1
2
3
4
5
6
7
8
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py

Django基本命令:

  • startproject:创建一个Django项目
  • startapp:创建一个Django应用
  • check 校验项目完整性
  • runserver:本地运行项目
  • shell:进入python shell环境
  • test:用例测试
  • makemigrations: c创建模型变更的迁移文件
  • migrate:执行上一个命令创建的迁移文件
  • dumpdata: 数据库数据导出到文件
  • loaddata:把文件数据导入到数据库

项目目录介绍:

  • settings.py: 项目配置文件
  • urls.py: 项目路由配置文件
  • manage.py: 项目管理文件

踩坑记录:

  1. 如果适用的anaconda的python,那么startproject会报错:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块
    解决方案: https://blog.csdn.net/sayWhat_sayHello/article/details/114464801

Django创建应用

一个Django项目可以有多个应用

Django创建应用:
python manage.py startapp xxxx

应用目录介绍:

  • views.py: 视图处理
  • models.py: 定义应用模型
  • admin.py: 定义Admin模块管理对象
  • apps.py: 声明应用
  • tests.py: 编写测试用例
  • urls.py: (自行创建) 管理应用路由

踩坑记录:

  1. import blog.views 报红但是可以运行
    解决方案:如果是同一级目录,直接import views 或者from . import views
  2. http://localhost:8000/ 报错
    解决防范:设置完自己的路由后,此时根目录无法展示出欢迎界面了,属于正常情况

Django模型层

模型层简介

  • 模型层位于Django视图层和数据库之间
  • Python对象和数据库表之间转换

为什么需要模型层,而不是直接操作数据库

  • 屏蔽不同数据库之间的差异,开发更加专注于业务逻辑开发
  • 提供很多便捷工具有助于开发

模型层数据库的配置
settings.py DATABASES字段

模型层定义字段

数字类型:IntegerField
文本类型:TextField
日期类型:DateTimeField
自增id: AutoField
主键定义:primary_key属性

models.py 直接新建一个类(继承models.Model)
然后定义好字段和键信息

之后进行模型迁移,保存到数据库中
python manage.py makemigrations //生成迁移文件
python manage.py migrate //运行迁移文件

Django shell

为什么需要使用Django shell
方便开发,方便调试

python manage.py shell 进入Django shell 环境

Django Admin

便于增删改查的操作

使用:

  1. python manage.py createsuperuser //创建超级管理员用户
  2. python manage.py runserver //启动Django项目
  3. 模型注册到admin中
    1
    2
    from .models import Article
    admin.site.register(Article)
  4. 修改模型层,让对象在admin后台里显示名字
    1
    2
    def __str__(self):
    return self.title

Django REST framework

quickstart

官网quickstart教程

这里要注意,一般django-admin startproject xxx 是创立一个项目,然后在项目里创建一个与项目同名的应用
这里django-admin startproject tutorial . # Note the trailing ‘.’ character
是在当前目录创建应用,所以项目和应用合并,这看起来很不寻常。使用项目的命名空间可避免与外部模块发生名称冲突

Django ORM

基本介绍

ORM (Object-Relational Mapping)
对象自动持久化到关系型数据库当中,业务逻辑层和数据库层之间的桥梁

Django ORM中
ORM – DB
类 <–> 数据表
对象 <–> 数据行
属性 <–> 字段

模型类 models.py
优势:提高业务逻辑效率
缺点:影响性能

字段类型和参数

常用字段

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
class Test(models.Model):  # courses_test
"""测试学习用"""
# Auto = models.AutoField() # 自增长字段
# BigAuto = models.BigAutoField()

# 二进制数据
Binary = models.BinaryField()

# 布尔型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()

# 整型
PositiveSmallInteger = models.PositiveSmallIntegerField(db_column="age") # 5个字节
SmallInteger = models.SmallIntegerField(primary_key=False) # 6个字节
PositiveInteger = models.PositiveIntegerField() # 10个字节
Integer = models.IntegerField(verbose_name="11个字节大小") # 11个字节
BigInteger = models.BigIntegerField(unique=True) # 20个字节

# 字符串类型
Char = models.CharField(max_length=100, null=True, blank=True, db_index=True) # varchar
Text = models.TextField(help_text="这个是longtext") # longtext

# 时间日期类型
Date = models.DateField(unique_for_date=True, auto_now=True)
DateTime = models.DateTimeField(editable=False, unique_for_month=True, auto_now_add=True)
Duration = models.DurationField() # int, Python timedelta实现

# 浮点型
Float = models.FloatField()
Decimal = models.DecimalField(max_digits=4, decimal_places=2) # 11.22, 16.34

# 其它字段
Email = models.EmailField() # 邮箱
Image = models.ImageField()
File = models.FileField()
FilePath = models.FilePathField()
URL = models.URLField()
UUID = models.UUIDField()
GenericIPAddress = models.GenericIPAddressField()

关系型字段

一对一(OneToOneField);
多对一(ForeignKey);
多对多(ManyToManyKey),默认中间表.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A(models.Model):
onetoone = models.OneToOneField(Test, related_name="one")


class B(models.Model):
foreign = models.ForeignKey(A, on_delete=models.CASCADE) # 删除级联
# foreign = models.ForeignKey(A, on_delete=models.PROTECT)
# foreign = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True) # 删除置空
# foreign = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0)
# foreign = models.ForeignKey(A, on_delete=models.DO_NOTHING)
# foreign = models.ForeignKey(A, on_delete=models.SET)


class C(models.Model):
manytomany = models.ManyToManyField(B)

字段参数


Python-Django开发笔记
https://vendestine.com/django-note
Author
Wenzhe Li
Posted on
November 13, 2022
Licensed under