Django-模型
基于ORM(对象关系映射)设计思想 ORM 解决的问题: 1.表与类的关系 2.记录和对象的关系 3.字段和属性的关系
Django中的应用
应用相当于将项目进行模块化。方便项目的管理
Django新建一个应用
在项目的虚拟环境中,终端输入python manage.py startapp 应用名此时,Django还不识别此应用,需要在项目文件的settings.py配置文件中激活应用 `INSTALLED_APPS = [ ‘应用名’ ]在该应用下新建一个urls.py文件作为应用路由
from django
.urls
import path
from django
.conf
.urls
import url
urlpatterns
= [
路由
]
在项目路由中管理应用路由 url(r'^项目路由/', include('应用.urls'))访问应用下的路由方式 localhost/项目路由地址/应用路由地址
模型的定义
from django
.db
import models
class Student(models
.Model
):
pass
模型中常见的属性
TextField:等价于数据库中的longtextCharFiled:等价于数据库中varchar
EmailField:等价于数据库中的varchar,但会自动校验格式URLField:等价于数据库中的varchar,自动校验路由FileField:等价于数据库中的varchar,可以做文件上传UUIDField:等价于数据库中的varchar,32位长度的字符串ImageField:等价于数据库中的varchar,用于存储图片 IntegerField:等价于数据库中的int/integer
AutoField:定义自动增长的属性,常用于设置主键 FloatField:等价于数据库中的floatDecimalField:等价于数据库中的decimal DateField:等价于数据库中的dateDateTimeField:等价于数据库中的datetime BinaryField:等价于数据库中的longblob,用于存储视频、音频等 OneToOneField:关联关系,一对一ForeignerKeyField:关联关系,多对一ManyToManyField:关联关系,多对多
属性类中常见的属性
verbose_name:影响后台站点的值,代表属性的名称name:不掌握,用于给属性设置名字primary_key:用于设置该属性是否是主键,默认为False,影响数据库的约束max_length:设置属性的最大长度,一般在字符串中使用unique:设置属性值是否唯一,影响数据库的约束blank:默认值为False,代表非空,但并不影响数据库,只影响网页null:默认值为False,代表非空,影响数据库的非空约束default:用于设置默认值editable:默认值为True,代表属性是否可编辑,是影响网页的属性choices:设置可选项,有点类似于数据库的枚举enum,能够同时影响网页和数据库help_text:属性的提示信息,影响网页db_colum:用于设置数据库的字段名,默认值和属性名保持一致auto_created:设置属性是否自动增长validators:设置校验的规则error_messages:页面校验失败的提示信息 python部分源码
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):
self
.name
= name
self
.verbose_name
= verbose_name
self
._verbose_name
= verbose_name
self
.primary_key
= primary_key
self
.max_length
, self
._unique
= max_length
, unique
self
.blank
, self
.null
= blank
, null
self
.remote_field
= rel
self
.is_relation
= self
.remote_field
is not None
self
.default
= default
self
.editable
= editable
self
.serialize
= serialize
self
.unique_for_date
= unique_for_date
self
.unique_for_month
= unique_for_month
self
.unique_for_year
= unique_for_year
if isinstance(choices
, collections
.abc
.Iterator
):
choices
= list(choices
)
self
.choices
= choices
self
.help_text
= help_text
self
.db_index
= db_index
self
.db_column
= db_column
self
._db_tablespace
= db_tablespace
self
.auto_created
= auto_created
一些特殊的属性
日期Field类中的属性
auto_now:默认值是False,相当于数据库中的now(),代表是否使用当前系统时间,如果为True,则取数据库的当前时间
通过模型自动生成表
生成迁移文件 终端中输入 python manage.py makemigrations 应用名可以查看迁移文件准备执行的命令(非必须执行) python manage.py sqlmigrate 应用名 migration_code执行迁移文件 python manage.py migrate 应用名 如果不加应用名 django会自动执行所有的迁移文件
与数据库相关的改动,必须重新迁移,与网页相关的改动可以不迁移
数据库中表的名字默认的格式为:应用名_类名 `appName_className` 如果想修改表的名字,需要在该类中设置Meta元类,并设置db_table属性
class TestName(models
.Model
):
name
= models
.CharField
(max_length
=50, verbose_name
="测试名")
class Meta:
db_table
= 'new_name'
class Meta中还有一个属性managed,默认值为True,代表表的维护(创建,修改,删除)由迁移来完成,如果是False,代表表的维护由手动完成。 一般不更改,当项目完成时,将managed属性去掉。
通过表生成模型(逆向工程)
python manage.py inspectdb 表 >> 应用名/models.py
多个表用空格分隔