数据库驱动
常见MySQL驱动介绍:
- MySQL-python:也就是MySQLdb。是对C语言操作MySQL数据库的一个简单封装。遵循了Python DB API v2。但是只支持Python2,目前还不支持Python3
- mysqlclient:是MySQL-python的另外一个分支。支持Python3并且修复了一些bug。
- pymysql:纯Python实现的一个驱动。因为是纯Python编写的,因此执行效率不如MySQL-python。并且也因为是纯Python编写的,因此可以和Python代码无缝衔接。
- MySQL Connector/Python:MySQL官方推出的使用纯Python连接MySQL的驱动。因为是纯Python开发的。效率不高。
安装数据库
pip install mysqlclient
#配置数据库
settings.py
DATABASES = {
'default': {
#数据库引擎(splite3/mysql/oracle)
'ENGINE': 'django.db.backends.mysql',
'NAME':'python_test',
#数据库用户名
'USER':'root',
#数据库密码
'PASSWORD':'',
#数据库主机地址
'HOST':'127.0.0.1',
#数据库端口号
'PORT':'3306'
}
}
#操作方式
- 原生SQL
- ORM模型
ORM模型(Object Relational Mapping)
Object Relational Mapping.对象关系映射
通过ORM我们可以通过类的方式去操作数据库,而不用原生的SQL语句。通过把表映射成类,把行当作实例,把字段当作属性。
ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
在django中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的int类型的主键,并且这个主键的名字就叫做id
那…什么是模型呢(Model)。一个模型(model)就是一个单独的、确定的数据的信息源,包含了数据的字段和操作方法。通常,每个模型映射为一张数据库中的表。
模型的基本原则:
- 每个模型在Django中的存在形式为一个Python类
- 每个模型都是django.db.models.Model的子类
- 模型的每个字段(属性)代表数据表的某一列
优点
- 简单易用、直观、清晰
- 性能损耗小
- 设计灵活
- 移植性强
步骤
- 配置数据库
- app中在
models.py
定义好模型 继承django.db.models
- app在
settings.py
注册 - 生成迁移脚本文件
python manage.py makemigrations
- 映射到数据库中
python manage.py migrate
- 基本操作
from django.db import models
# Create your models here.
# 如果将一个普通的类 编程一个可以映射到数据库中的ORM模型
# 继承models.Model
class Book(models.Model):
'''
1. id int 自动增
2. name varchar
3. author varchar
'''
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, null=False)
author = models.CharField(max_length=255, null=False)
def __str__(self):
#<Book:(name,author)>
return "<Book:({name},{author})>".format(name=self.name,author=self.author)
#添加数据
def index(request):
# 1. 使用ORM添加一条数据到数据库中
book = Book(name="三国演义",author="罗贯中")
book.save() #save()方法
return HttpResponse("添加成功")
def index(request):
# 2. 查询 根据主键(PK)
book = Book.objects.get(pk=1)
print(book)
return HttpResponse(book)
#根据其他条件查询
books = Book.objects.filter(name="三国演义")
books = Book.objects.filter(author="罗贯中").first()
print(books)
return HttpResponse(books)
#3. 删除数据
book = Book.objects.get(pk=1)
book.delete()
return HttpResponse("删除成功")
#4. 修改数据
book = Book.objects.get(pk=2)
book.name = "未知"
book.save()
return HttpResponse("Success")
常用字段
说明 | 类型 |
---|---|
AutoField | 一个自动增加的整数类型字段。Django会自动帮你添加字段:id = models.AutoField(primary_key=True),这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为primary_key=True。Django在一个模型中只允许有一个自增字段,并且该字段必须为主键! |
BigAutoField | (1.10新增)64位整数类型自增字段,数字范围更大,从1到9223372036854775807 |
BigIntegerField | 64位整数字段(看清楚,非自增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个textinput标签。 |
BinaryField | 二进制数据类型。 |
BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField。 |
CharField | 字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是input text。最常用的filed,没有之一! |
DateField | 日期类型。一个Python中的datetime.date的实例。 |
DateTimeField | 日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样。 |
DecimalField | 固定精度的十进制小数。相当于Python的Decimal实例,必须提供两个指定的参数!参数max_digits:最大的位数,必须大于或等于小数点位数 。decimal_places:小数点位数,精度。 当localize=False时,它在HTML表现为NumberInput标签,否则是text类型。例子:储存最大不超过999,带有2位小数位精度的数,定义如下:models.DecimalField(…, max_digits=5, decimal_places=2)。 |
EmailField | 邮箱类型,默认max_length最大长度254位。使用这个字段的好处是,可以使用DJango内置的EmailValidator进行邮箱地址合法性验证。 |
FileField | class FileField(upload_to=None, max_length=100, **options)上传文件类型 |
FilePathField | 文件路径类型, |
FloatField | 浮点数类型 |
ImageField | 图像类型 |
IntegerField | 整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput标签 |
GenericIPAddressField | class GenericIPAddressField(protocol=’both’, unpack_ipv4=False, **options)[source],IPV4或者IPV6地址,字符串形式,例如192.0.2.30在HTML中表现为TextInput标签。参数protocol默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。 |
NullBooleanField | 类似布尔字段,只不过额外允许NULL作为选项之一。 |
TextField | 大量文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。 |
TimeField | 时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒 |
URLField | 一个用于保存URL地址的字符串类型,默认最大长度200。 |
UUIDField | 用于保存通用唯一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品 |
常用参数
null
如果设置为True,Django将会在映射表的时候指定是否为空。默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串””来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,那么对应的可空的字段则为NullBooleanField
blank
标识这个字段在表单验证的时候是否可以为空。默认是False
db_column
这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字
default
默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。
priary_key
是否为主键。默认是False
unique
在表中这个字段的值是否唯一。一般是设置手机号码/邮箱等
类中定义类Meta。在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
class Meta:
db_table = 'book_model'
db_table
这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。
ordering
设置在提取数据的排序方式
应用
上传文件
上传图片
UUID
import uuid
from django.db import models
class MyModel(models.Model):
id = models.UUIDField(primary_key=True,default=uuid.uuid4, editable=False)
FilePathField
它是用来保存文件路径信息的字段,在数据表内以字符串的形式存在,最大长度100
参数
- path 必须指定的参数。表示一个系统绝对路径。
- match 可选参数,一个正则表达式,用于过滤文件名。只匹配基本文件名,不匹配路径。
- recursive 可选参数,只能是True或者False。默认为False。决定是否包含子目录,也就是是否递归的意思
- allow_files 可选参数,只能是True或者False。默认为True。决定是否应该将文件名包括在内。它和allow_folders其中,必须有一个为True
- allow_folders 可选参数,只能是True或者False。默认为False。决定是否应该将目录名包括在内