通过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 操作 - 字段的类型和参数相关推荐

  1. Django数据库orm操作以list形式获取数据库中某列所有值

    文章目录 问题: 解决办法: 方式一: 方式二: 方式三: 写在最后 问题: 如图所示,Django数据库中存储如下字段. 这是在前端渲染出的数据.现在的需求是:要把factory这一列数据从后端数据 ...

  2. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  3. 西游之路——python全栈——Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  4. Django从理论到实战(part31)--Django数据库查询操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: Django数据库查询操作 查找是数据库操作中一个非常重要的技术,查询一般就是使用filter.exclude以及get三个 ...

  5. django的orm指定字段名,表名 verbose_name_plural

    django的orm指定字段名,表名 verbose_name_plural 1.指定字段名: 在定义字段的时候,增加参数db_column='real_field': 2.指定表名: 在model的 ...

  6. Django 使用 ORM 操作数据库详解

    ORM 是个啥? 在python中的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率. 同样在操作数据库时,一般我们用SQL语句来实现操作,但是 ...

  7. Django 之ORM操作

    1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...

  8. Django:ORM关系字段

    一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ...

  9. Django之ORM操作

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

最新文章

  1. 二相并行FIR滤波器的matlab及使用FIR IP 核的FPGA实现
  2. sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
  3. mybatis foreach 错误_MyBatis高级结果映射之一对一映射
  4. app获取个人信息是否合法_重拳出击!42款APP过度收集用户信息被点名
  5. word把选择答案弄到题目里_word中把选择题的正确答案自动填到括号里技巧
  6. C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)
  7. 实训作业 4(界面2)
  8. HTML5小试 双人贪吃蛇
  9. 中国微型连接器市场趋势报告、技术动态创新及市场预测
  10. Java实现Word转PDF【完整版】
  11. Oracle的overlaps函数转换其他数据库语法
  12. SCCM 2012系列之二 Operations Manager系统要求
  13. SpringBoot实现12306自动抢票系统
  14. Android 9 导航栏添加截图按钮
  15. Pycharm社区版运行Django的三种方法(Pycharm添加配置参数快捷启动Django、Pycharm社区版Django项目创建)
  16. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)...
  17. JumpServer七周年:感谢社区的老铁们为我们点赞
  18. java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY.
  19. Ditto初体验:配置剪贴板数据同步以及局域网同步
  20. .NET整合及绿色软件工具VMThinApp使用

热门文章

  1. 苹果自带相册打马赛克_老王被绿?iOS 13惊现漏洞,马赛克去除
  2. mysql 5.7.16默认密码_(转)Ubuntu16安装mysql5.7未提示输入密码,安装后修改mysql默认密码...
  3. C 回顾 volatile 和 register 修饰符
  4. apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容
  5. 播放失败246106异常代码_web前端面试题:您能读懂的Promise源码实现(手写代码)...
  6. HDLBits 系列(42)根据仿真波形来设计电路之时序逻辑
  7. 从MATLAB帮助文档上学习 chirp
  8. 【 C 】assert.h 简明介绍
  9. 2018.11.06-知识回顾
  10. MySQL数据库(十) 一一 数据库的导出和导入