企业开发中,通常都是从数据定义开始一个项目,所以我们也从models开始深入了解一下。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
文章目录
环境搭建
离开之前的HelloDjango项目,新建一个DjangoModel项目。
步骤和之前是一样的,这里就不详细演示每一步的操作了:
- virtualenv创建虚拟环境,这里可以直接用之前的虚拟环境。记得activate环境
django-admin startproject DjangoModel新建项目- pycharm打开项目,注意是在
manage.py的上一级打开 - 配置解释器为虚拟环境内的python,前一个项目的第三方包都会自动识别
python manage.py startapp App新建一个应用,并在settings中注册- mysql创好数据库DjangoModel,每次都用新的库,不然会有问题
- 修改配置文件
settings.py,包括数据库连接信息,全局templates文件路径等等 - 全局
__init__.py中对pymysql进行伪装pymysql.install_as_MySQLdb() - 默认数据迁移
python manage.py migrate
ORM
ORM(Object Relational Mapping),对象关系映射,可以简单理解为一个翻译机。其将面向对象的操作翻译为后端的SQL语句,达到业务逻辑和数据操作的解耦合。
如果直接对数据库进行操作,会涉及到SQL语句中的insert,select等等操作,而且不同类型的数据库可能SQL的语法还不太一样。ORM相当于提供了一个统一的接口,不管后端是什么数据库,在面向对象中调用提供的接口,ORM会自动翻译成后端可用的SQL语句。
具体的细节不需要关系,只需要会使用即可。
数据类型的映射
在Django的models.py中定义的一个继承自models.Model的class就对应着数据库中的一个table,而这个class中的属性就对应着数据库中的字段(field)。class和table对应还很好理解,就是定义一个名字,但是class的属性和字段的对应就有可能有矛盾了。
数据库中的数据类型总结起来就三种:数字,字符和时间。
但是Django从用户接受的数据却不仅仅局限于这三种,用户有可能上传文件或者图片,又或者利用前端的textarea传递来一长串的内容。
为了解决这种不对称性,Django的models为我们提供了很多数据类型来选择,这些不同的数据类型对应着内存中不同的存储方式。
Models中的数据类型
这些数据类型定义在django.db.models.fields中。
- AutoField
一个根据ID自动增长的IntegerField,通常不用自己定义。不定义的话,一个主键字段会被自动添加到models中 - CharField(max_length=xx)
字符串,默认的前端表单样式是InputText - TextField
大文本字段,默认的前端表单样式是TextArea - IntegerField
整型 - DecimalField
更精确的十进制浮点数,python的Decimal实例表示 - FloatField
浮点型 - BooleanField
布尔类型 - NullBooleanField
支持Null,True,False三种类型 - DateField/TimeField/DateTimeField
和时间相关的数据类型 - FileField
上传文件的字段。直接存文件会造成数据库非常臃肿,这里存的是文件的存储路径 - ImageField
继承自FileField,不过多加了一步校验,确保是image
约束条件
上面的这些数据类型都是继承自django.db.models.fields.field类,我们来看看这个类的构建方法
def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='', db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
可以看到在定义的时候还可以加入一些限制条件,这些其实和SQL中的限制条件类似
- null
默认是False,如果是True,Django会将空值以null存储到数据库中 - blank
默认是False,如果是True,该字段允许为空白。注意区分null和blank的区别,null是数据库范畴的概念 - db_column
指定字段在数据库中存储的名字,如果不指定,以类属性代替 - db_index
给字段加索引,加索引要谨慎 - default
默认值 - primary_key
主键 - unique
唯一性约束
元选项
在models的类中再定义一个类,用于设置元数据
class meta:
db_table = xxx # 定义table的名字
ording = [] # 根据某些字段来排序
实际操作(数据类型映射)
在App/models.py中创建一个model,如下
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=16, unique=True)
age = models.IntegerField(default=18)
sex = models.BooleanField(default=False) # False is female, True is male
class Meta:
db_table = 'People'
相当于在数据库中创建一个表,表的名字由原先的App_person改为People。同时定义了3个字段,对应着三种不同的Django数据类型,同时还加了一些约束。
然后生成迁移文件并执行迁移,如下:
(django) [fuh

最低0.47元/天 解锁文章
3571

被折叠的 条评论
为什么被折叠?



