Django中ORM之创建模型
ORM
- 数据库与ORM映射关系
- 表名 --- 类名
- 字段 --- 属性
- 表记录 --- 类示例对象
创建表(建立模型)
模型建立如下
- class Book(models.Model):
- title = models.CharField(max_length=32)
- price = models.DecimalField(max_digits=6, decimal_places=2)
- create_time = models.DateTimeField()
- memo = models.CharField(max_length=32, default="")
- #与publish建立一对多的关系,外键字段建立在多的一方
- publish = models.ForeignKey(to="Publish", default=1)
- #与author表建立多对多的关系,ManyToManyField可以建立在两个模型中的任意一个,自动创建第三张表
- author = models.ManyToManyField("Author")
- def __str__(self):return self.title
- class Publish(models.Model):
- name = models.CharField(max_length=32)
- email = models.CharField(max_length=32)
- class Author(models.Model):
- name = models.CharField(max_length=32)
- def __str__(self):return self.name
通过logging可以查看翻译成的sql语句
- LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'handlers': {
- 'console':{
- 'level':'DEBUG',
- 'class':'logging.StreamHandler',
- },
- },
- 'loggers': {
- 'django.db.backends': {
- 'handlers': ['console'],
- 'propagate': True,
- 'level':'DEBUG',
- },
- }
- }
注意事项
- 1、 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称
- 2、id 字段是自动添加的
- 3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
- 4、这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
- 5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。
- 6、外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None
常用字段和参数
常用字段
AutoField
int自增列,必须填入参数primary_key=true,当model中如果没有自增列,则自动会创建一个列名为id的列
IntegerField
一个整数类型,范围在-2147483648 to 2147483647
CharField
字符类型,必须提供max_length参数,表示字符长度
DateField
日期字段,日期格式YYYY-MM-DD,相当于python中的datetime.date()实例
DateTimeField
日期时间字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于python中的datetime.datetime实例
字段合集
- AutoField(Field)
- - int自增列,必须填入参数 primary_key=True
- BigAutoField(AutoField)
- - bigint自增列,必须填入参数 primary_key=True
- 注:当model中如果没有自增列,则自动会创建一个列名为id的列
- from django.db import models
- class UserInfo(models.Model):
- # 自动创建一个列名为id的且为自增的整数列
- username = models.CharField(max_length=32)
- class Group(models.Model):
- # 自定义自增列
- nid = models.AutoField(primary_key=True)
- name = models.CharField(max_length=32)
- SmallIntegerField(IntegerField):
- - 小整数 -32768 ~ 32767
- PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正小整数 0 ~ 32767
- IntegerField(Field)
- - 整数列(有符号的) -2147483648 ~ 2147483647
- PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正整数 0 ~ 2147483647
- BigIntegerField(IntegerField):
- - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
- BooleanField(Field)
- - 布尔值类型
- NullBooleanField(Field):
- - 可以为空的布尔值
- CharField(Field)
- - 字符类型
- - 必须提供max_length参数, max_length表示字符长度
- TextField(Field)
- - 文本类型
- EmailField(CharField):
- - 字符串类型,Django Admin以及ModelForm中提供验证机制
- IPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
- GenericIPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- - 参数:
- protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
- unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
- URLField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证 URL
- SlugField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
- CommaSeparatedIntegerField(CharField)
- - 字符串类型,格式必须为逗号分割的数字
- UUIDField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
- FilePathField(Field)
- - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- - 参数:
- path, 文件夹路径
- match=None, 正则匹配
- recursive=False, 递归下面的文件夹
- allow_files=True, 允许文件
- allow_folders=False, 允许文件夹
- FileField(Field)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- ImageField(FileField)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- width_field=None, 上传图片的高度保存的数据库字段名(字符串)
- height_field=None 上传图片的宽度保存的数据库字段名(字符串)
- DateTimeField(DateField)
- - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
- DateField(DateTimeCheckMixin, Field)
- - 日期格式 YYYY-MM-DD
- TimeField(DateTimeCheckMixin, Field)
- - 时间格式 HH:MM[:ss[.uuuuuu]]
- DurationField(Field)
- - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
- FloatField(Field)
- - 浮点型
- DecimalField(Field)
- - 10进制小数
- - 参数:
- max_digits,小数总长度
- decimal_places,小数位长度
- BinaryField(Field)
- - 二进制类型
- class FixedCharField(models.Field):
- """
- 自定义的char类型的字段类
- """
- def __init__(self, max_length, *args, **kwargs):
- self.max_length = max_length
- super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
- def db_type(self, connection):
- """
- 限定生成数据库表的字段类型为char,长度为max_length指定的值
- """
- return 'char(%s)' % self.max_length
- class Class(models.Model):
- id = models.AutoField(primary_key=True)
- title = models.CharField(max_length=25)
- # 使用自定义的char类型的字段
- cname = FixedCharField(max_length=25)
自定义字段
- 'AutoField': 'integer AUTO_INCREMENT',
- 'BigAutoField': 'bigint AUTO_INCREMENT',
- 'BinaryField': 'longblob',
- 'BooleanField': 'bool',
- 'CharField': 'varchar(%(max_length)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
- 'DateField': 'date',
- 'DateTimeField': 'datetime',
- 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
- 'DurationField': 'bigint',
- 'FileField': 'varchar(%(max_length)s)',
- 'FilePathField': 'varchar(%(max_length)s)',
- 'FloatField': 'double precision',
- 'IntegerField': 'integer',
- 'BigIntegerField': 'bigint',
- 'IPAddressField': 'char(15)',
- 'GenericIPAddressField': 'char(39)',
- 'NullBooleanField': 'bool',
- 'OneToOneField': 'integer',
- 'PositiveIntegerField': 'integer UNSIGNED',
- 'PositiveSmallIntegerField': 'smallint UNSIGNED',
- 'SlugField': 'varchar(%(max_length)s)',
- 'SmallIntegerField': 'smallint',
- 'TextField': 'longtext',
- 'TimeField': 'time',
- 'UUIDField': 'char(32)',
ORM字段与数据库字段的对应关系
字段参数
null
用于表示某个字段可以为空
unique
表示该字段在表中必须是唯一的
db_index
表示为此字段设置索引
default
为该字段设置默认值
DateField和DateTimeField
对于auto_now和auto_now_add,两者默认值都为False
auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
auto_now=true,每次更新数据记录的时候会更新该字段
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在'一对多'中多的一方
字段参数
to:设置要关联的表
to_field:设置要关联的表的字段
related_name:反向查询时,使用的字段名,用于代替反向查询时的'表名_set'
- class Classes(models.Model):
- name = models.CharField(max_length=32)
- class Student(models.Model):
- name = models.CharField(max_length=32)
- theclass = models.ForeignKey(to="Classes", related_name="students")
- #当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写
- models.Classes.objects.first().students.all()
related_query_name:反向查询操作时,使用的连接前缀,用于替换表名
on_delete:当删除关联表中的数据时,当前表与其关联的行的行为
- models.CASCADE
- 删除关联数据,与之关联也删除
- models.DO_NOTHING
- 删除关联数据,引发错误IntegrityError
- models.PROTECT
- 删除关联数据,引发错误ProtectedError
- models.SET_NULL
- 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
- models.SET_DEFAULT
- 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
- models.SET
- 删除关联数据,
- a. 与之关联的值设置为指定值,设置:models.SET(值)
- b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
- def func():
- return 10
- class MyModel(models.Model):
- user = models.ForeignKey(
- to="User",
- to_field="id",
- on_delete=models.SET(func)
- )
db_constraint:是否在数据库中创建外键约束,默认为True
OneToOneField
通常一对一字段用来扩展已有字段
字段参数
to:设置要关联的表
to_field:设置要关联的字段
on_delete:同ForeignKey字段
ManyToManyField
表示多对多的关联关系,在数据库中通过第三张表来建立关联关系
字段参数
to:设置要关联的表
related_name:同ForeignKey字段
related_query_name:同ForeignKey字段
symmetrical:仅用于多对多自关联时,指定内部是否创建反向操作的字段,默认为True
- class Person(models.Model):
- name = models.CharField(max_length=16)
- friends = models.ManyToManyField("self", symmetrical=False)
- #person对象现在就可以使用person_set属性进行反向查询
through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系,但也可以手动创建第三张表,此时就需要通过through来指定第三张表名
through_fields:设置关联的字段
db_table:默认创建第三张时,数据库中表的名称
元信息
- ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
- db_table:ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名
- index_together:联合索引
- unique_together:联合唯一索引
- ordering:指定默认按什么字段排序。
- 只有设置了该属性,我们查询到的结果才可以被reverse()
Django中ORM之创建模型的更多相关文章
- Django中ORM创建表关系
一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- 关于Django中ORM数据库迁移的配置
Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...
- Django中ORM的使用
Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- Django中ORM实际应用
1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...
- Django 中ORM 的使用
一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...
- Django中ORM多对多表的操作
自己创建第三张表建立多对多关系 表的创建 # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = mode ...
随机推荐
- Java中数组的定义方式
数组定义方式一 动态方式(指定数组的长度) 格式: 数组存储的数据类型[]数组名字 = new 数组存储的数据类型[长度]; [] : 表示数组. 数组名字:为定义的数组起个变量名,满足标识符规范,可 ...
- webstorm主题网址
http://www.phpstorm-themes.com/ http://www.riaway.com/theme.php
- BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割
十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...
- 路飞学城Python-Day137
django项目二 个人博客系统 github地址:https://github.com/pandaboy1123/cnblog
- WEBGL学习【三】颜色选择
<html lang="zh-CN"> <head> <title>NeHe's WebGL</title> <meta ch ...
- NetOps Defined
https://www.logzilla.net/2017/06/20/the-network-operations-top-5.html
- MySql 基础学习笔记 1——概述与基本数据类型: 整型: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的差别 图 浮点型:命令
一.CMD中经常使用mysql相关命令 mysql -D, --database=name //打开数据库 --delimiter=name //指定分隔符 -h, --host=name // ...
- 【前端福利】用grunt搭建自己主动化的web前端开发环境-完整教程
jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发者.假设你如今还不知道grunt或者听说过. ...
- Apache支持多端口配置处理
玩了这么多年,终于知道原来Apache也可以支持多个端口监听!!!!!!!!!!!!!!!!!!!这样就可以一个服务器,存放多个项目了,一个ip多个端口,匹配多个项目. 试了下linux,也是可以的 ...
- Http multipart/form-data多参数Post方式上传数据
最近,工作中遇到需要使用java实现http发送get.post请求,简单的之前经常用到,但是这次遇到了上传文件的情况,之前也没深入了解过上传文件的实现,这次才知道通过post接口也可以,是否还有其他 ...