Django 数据库ORM 操作 - 字段的类型和参数
通过Django的ORM创建表的时候,我们需要定义自己的类。 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下。
首先看看字段的类型。尽管Python提供了近乎20种类型,他转换成数据库表之后,其实本质就是4个类型:字符串,数字,时间和二进制。
AutoField(Field)- int自增列,必须填入参数 primary_key=True
BigAutoField(AutoField)- bigint自增列,必须填入参数 primary_key=True注:当model中如果没有自增列,则自动会创建一个列名为id的列from django.db import modelsclass 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
自定义无符号整数字段class UnsignedIntegerField(models.IntegerField):def db_type(self, connection):return 'integer UNSIGNED'PS: 返回值为字段在数据库中的属性,Django字段默认的值为:'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)',
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.FileSystemStoragewidth_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)- 二进制类型
比如下面的例子中,CharField是字符串,EmailField同样也是字符串, 如果在数据库里面打开 可以看见类型都是varchar。那么他的区别在哪里呢?这是在通过Django admin页面管理数据库的时候,他会自动做一个验证。
例1
class UserInfo(models.Model):username = models.CharField(max_length=32,blank=True,verbose_name='用户名')password = models.CharField(max_length=60, help_text='pwd')email = models.CharField(max_length=60)test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'})user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew)user_type_choices = ((1, '超级用户'),(2, '普通用户'),(3, '普普通用户'),)user_type_id = models.IntegerField(choices=user_type_choices,default=1)
数据库的表结构
Django 管理界面。第一次使用需要创建一个超级用户,方法如下 python manage.py createsuperuser。然后在admin.py里面执行执行注册,
例如
from django.contrib import admin
from app01.models import userinfo
admin.site.register(userinfo)
登录之后可以修改表的内容,他会自动进行格式的验证
Django admin界面
例2:这里定义了时间类型的字段, 同时我不希望使用自动生成的id字段,因此需要手动定义一个自增的主键
class UserGroup(models.Model):uid = models.AutoField(primary_key=True)caption = models.CharField(max_length=32,unique=True)ctime = models.DateTimeField(auto_now_add=True, null=True)uptime = models.DateTimeField(auto_now=True, null=True)
这里需要强调一下时间类型,如果在setting里面设置了USE_TZ=True, 保存在数据库里面的时间始终是UTC的时间,如果需要在模板里面显示其他的时间,可以修改TIME_ZONE='Asia/Shanghai',这样他自动会以北京时间来显示。
例如:豆子希望网页上显示悉尼的时间,可以发现数据库的时间是UTC时间,而网页输出的是悉尼时间
settings.py
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Australia/Sydney'
USE_I18N = True
USE_L10N = True
USE_TZ = True
数据库表
网页
定义字段的时候,除了类型,还需要指定对应的参数。在Django里面,他提供了以下参数:
null -> db是否可以为空
default -> 默认值
primary_key -> 主键
db_column -> 列名
db_index -> 索引
unique -> 唯一索引
unique_for_date -> 根据时间来索引
unique_for_month -> 根据月份来索引
unique_for_year -> 根据年份来索引
auto_now -> 创建时,自动生成时间
auto_now_add -> 更新时,自动更新为当前时间
choices -> django admin中显示下拉框,避免连表查询
blank -> django admin是否可以为空
verbose_name -> django admin显示字段中文
editable -> django admin是否可以被编辑
error_messages -> 错误信息欠
help_text -> django admin提示
validators -> django form ,自定义错误信息(欠)
请注意在例1中choice的使用,这样的好处是对于不怎么改变的值,可以直接保存在内存中比较快;而经常变化的值,我们还是需要使用数据库进行多表的查询
转载于:https://blog.51cto.com/beanxyz/1945909
Django 数据库ORM 操作 - 字段的类型和参数相关推荐
- Django数据库orm操作以list形式获取数据库中某列所有值
文章目录 问题: 解决办法: 方式一: 方式二: 方式三: 写在最后 问题: 如图所示,Django数据库中存储如下字段. 这是在前端渲染出的数据.现在的需求是:要把factory这一列数据从后端数据 ...
- 【Django】ORM操作#2
目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...
- 西游之路——python全栈——Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django从理论到实战(part31)--Django数据库查询操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: Django数据库查询操作 查找是数据库操作中一个非常重要的技术,查询一般就是使用filter.exclude以及get三个 ...
- django的orm指定字段名,表名 verbose_name_plural
django的orm指定字段名,表名 verbose_name_plural 1.指定字段名: 在定义字段的时候,增加参数db_column='real_field': 2.指定表名: 在model的 ...
- Django 使用 ORM 操作数据库详解
ORM 是个啥? 在python中的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率. 同样在操作数据库时,一般我们用SQL语句来实现操作,但是 ...
- Django 之ORM操作
1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...
- Django:ORM关系字段
一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ...
- Django之ORM操作
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
最新文章
- 二相并行FIR滤波器的matlab及使用FIR IP 核的FPGA实现
- sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
- mybatis foreach 错误_MyBatis高级结果映射之一对一映射
- app获取个人信息是否合法_重拳出击!42款APP过度收集用户信息被点名
- word把选择答案弄到题目里_word中把选择题的正确答案自动填到括号里技巧
- C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)
- 实训作业 4(界面2)
- HTML5小试 双人贪吃蛇
- 中国微型连接器市场趋势报告、技术动态创新及市场预测
- Java实现Word转PDF【完整版】
- Oracle的overlaps函数转换其他数据库语法
- SCCM 2012系列之二 Operations Manager系统要求
- SpringBoot实现12306自动抢票系统
- Android 9 导航栏添加截图按钮
- Pycharm社区版运行Django的三种方法(Pycharm添加配置参数快捷启动Django、Pycharm社区版Django项目创建)
- 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)...
- JumpServer七周年:感谢社区的老铁们为我们点赞
- java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY.
- Ditto初体验:配置剪贴板数据同步以及局域网同步
- .NET整合及绿色软件工具VMThinApp使用
热门文章
- 苹果自带相册打马赛克_老王被绿?iOS 13惊现漏洞,马赛克去除
- mysql 5.7.16默认密码_(转)Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码...
- C 回顾 volatile 和 register 修饰符
- apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容
- 播放失败246106异常代码_web前端面试题:您能读懂的Promise源码实现(手写代码)...
- HDLBits 系列(42)根据仿真波形来设计电路之时序逻辑
- 从MATLAB帮助文档上学习 chirp
- 【 C 】assert.h 简明介绍
- 2018.11.06-知识回顾
- MySQL数据库(十) 一一 数据库的导出和导入