原文地址:https://www.cnblogs.com/limaomao/p/9255148.html

ORM:object relational mapping,对象关系映射

django中使用原生sql的弊端:
  1、SQL语句重复率很高,利用率不高
  2、如果业务逻辑生变,原生SQL更改起来比较多
  3、容易忽略一些web安全问题,如SQL注入

ORM的优点:
  易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。
  性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。
  设计灵活:可以轻松的写出复杂的查询。
  可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgreSQL和SQLite。可以非常轻松的切换数据库。

ORM常用字段类型:
  1、CharField:字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性以定义该字符串的最大长度,如果超过254个字符,就不建议使用CharField了,此时建议使用TextField

  2、EmailField:在数据库底层也是一个varchar类型,默认最大长度是254个字符,当然也可以自己传递max_length参数,这个Field在数据库层面不会限制一定要传递符合email条件的字符串,只是以后在使用ModelForm表单验证时,会起作用

  3、URLField:类似于CharField,在数据库底层也是一个varchar类型,只不过只能用来存储url格式的字符串。并且默认的max_length是200,同EmailField

  4、FloatField:浮点数类型,映射到数据库中会变成double类型

  5、IntegerField:整数类型,映射到数据库中会变成11位的int类型

  6、BigIntegerField:大整形。值的区间是-9223372036854775808——9223372036854775807

  7、PositiveIntegerField:正整形。值的区间是0——2147483647

  8、SmallIntegerField:小整形。值的区间是-32768——32767

  9、PositiveSmallIntegerField:正小整形。值的区间是0——32767

  10、BooleanField:布尔类型(True/False),映射到数据库中会变成长度只有1位的tinyint类型,这个Field不接受null参数,要想使用可以为null的布尔类型的字段,就要使用NullBooleanField

  11、AutoField:自增长类型,映射到数据库中是11位的整数,使用此字段时,必须传递primary_key=True,否则在生成迁移脚本文件时,就会报错,一个模型不能有两个自增长字段。一般情况下我们用不到这个字段,如果不定义主键,django会自动的为我们生成id字段作为主键

  12、BigAutoField:自增长类型,用法同AutoField。映射到数据库中会成为20位的bigint类型

  13、DateTimeField:日期时间类型,在python中对应的是datetime.datetime类型,在映射到数据库中也是datetime类型。使用这个Field可以传递以下几个参数:
    auto_now=True:在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段
    auto_now_add=True:在每条数据第一次被添加进去的时候,都使用当前的时间。比如作为一个记录第一次入库的字段
    注意:如果在setting.py中配置了USE_TZ=True,那么上两个默认值都来自于django.utils.timezone.now所转化来的值

    在模板中将一个UTC时间转换成本地时间:
    首先模板HTML文件的开头导入tz:
      {% load tz %}
    在传递过来的时间变量utc_time中使用localtime过滤器:
      {{utc_time | localtime}}
    其实,django知道我们的想法,已经为我们做好了配置,我们并不需要配置其他的东西就可以直接使用{{utc_time}},此时只要我们在setting.py文件中设置  USE_TZ=True,TIME_ZONE='Asia/Shanghai',UTC时间变量在渲染到模板上的时候会自动的为我们加载成TIME_ZONE中所设置的时区的时间。

  14、DateField:日期类型,用法同DateTimeField,在python中对应的是datetime.date类型,在映射到数据库中是date类型

  15、TimeField:时间类型,用法同DateTimeField,在python中对应的是datetime.time类型,在映射到数据库中是time类型

  16、FileField:用来存储文件的

  17、ImageField:用来存储图片文件的

  18、TextField:大量的文本类型

  19、DecimalField: 一个固定精度的十进制数类型,使用时必须要传递两个参数,max_digits数字的最大总长度(不含小数点),decimal_places小数部分的长度

Field的常用参数:
  1、null:标识是否可以为空,默认是为False。在使用字符串相关的Field(CharField/TextField/URLField/EmailField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,由于BooleanField不接受null参数,因此你如果想要设置这个字段可以为空的bool类型,那么对应的可空的bool类型字段则为NullBooleanField。

  2、blank:标识这个字段在表单验证的时候是否可以为空,默认是False。这个和null是有区别的,null是一个纯数据库级别的。而blank是表单验证级别的。

  3、db_column:这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。

  4、db_index:标识这个字段是否为索引字段。

  5、default:默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。在用函数作为值传递给default时,只能传递函数名,不需要加括号。

  6、primary_key:是否为主键,与AutoField/BigAutoField连用,默认是False。

  7、unique:在表中这个字段的值是否唯一,在数据库中就是唯一约束,一般是设置手机号码/邮箱等。

  8、choices:在一个范围内选择出一项,注意这个选项与ForeignKey的区别
    作用:1、django admin中显示下拉框;2、避免连表查询

    TYPE_CHOICES = (   #数据库只保存内部元祖的第一个值,后面的值保存在内存中
      (0, '---'),
      (1, '第一类'),
      (2, '第二类'),
      (3, '第三类'),
    )
    type = models.IntegerField(default=0,choices=TYPE_CHOICES)

模型中Meta配置:
  对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。示例代码如下:

  class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,null=True,blank=True)

    class Meta:
      db_table = 'book_model'

  以下将对Meta类中的一些常用配置进行解释。

  1、db_table:这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型所在app的名称加上模型名的小写来作为默认的表名。

  2、ordering:设置在提取数据的排序方式,因为可以按照多个字段以优先关系进行排序,所以需要传递一个字段的列表,在我们提取数据时,可以根据列表中字段从前到后(优先级从高到低)的方式排序,排序默认为正序,如果你需要哪个字段按倒序排列,就可以在这个字段前面加上"-"。后面章节会讲到如何查找数据。比如我想在查找数据的时候根据添加的时间排序,那么示例代码如下:

  class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
      db_table = 'book_model'
      ordering = ['pub_date',]

下面看看CharField参数介绍:

depot_name = models.CharField(
    u'设备库房名称',
    blank=True,
    max_length=20,
    null=True,
    # default='',
    help_text='显示在下方吗',
)
在这里u’设备库房名称‘,是将depot_name这个英文名重写,blank=True是允许表单验证为空,null=True是允许数据库这个值为空,help_text是提示信息v在这里u’设备库房名称‘,是将depot_name这个英文名重写,blank=True是允许表单验证为空,null=True是允许数据库这个值为空。

下文链接:https://blog.csdn.net/weixin_37773766/article/details/80330221

1. django 模型models 常用字段

1、models.AutoField  

  • 自增列 = int(11)
  • 如果没有的话,默认会生成一个名称为 id 的列
  • 如果要显式的自定义一个自增列,必须设置primary_key=True。

2、models.CharField  

  • 字符串字段
  •   必须设置max_length参数

3、models.BooleanField  

  • 布尔类型=tinyint(1)
  •   不能为空,可添加Blank=True

4、models.ComaSeparatedIntegerField  

  • 用逗号分割的数字=varchar
  •   继承CharField,所以必须 max_lenght 参数

5、models.DateField

  • 日期类型 date
  •   DateField.auto_now:保存时自动设置该字段为现在日期,最后修改日期
  • DateField.auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。

6、models.DateTimeField  

  • 日期时间类型 datetime
  •   同DateField的参数

7、models.Decimal  

  • 十进制小数类型 = decimal
  • DecimalField.max_digits:数字中允许的最大位数
  • DecimalField.decimal_places:存储的十进制位数

8、models.EmailField  

  •   一个带有检查 Email 合法性的 CharField

9、models.FloatField  

  • 浮点类型 = double

10、models.IntegerField  

  • 整形

11、models.BigIntegerField  

  • 长整形
  •   integer_field_ranges = {

    'SmallIntegerField': (-32768, 32767),

    'IntegerField': (-2147483648, 2147483647),

    'BigIntegerField': (-9223372036854775808, 9223372036854775807),

    'PositiveSmallIntegerField': (0, 32767),

    'PositiveIntegerField': (0, 2147483647),

  }

12、models.GenericIPAddressField  

  • 一个带有检查 IP地址合法性的 CharField

13、models.NullBooleanField  

  • 允许为空的布尔类型

14、models.PositiveIntegerFiel  

  • 正整数

15、models.PositiveSmallIntegerField  

  • 正smallInteger

16、models.SlugField  

  • 减号、下划线、字母、数字

17、models.SmallIntegerField  

  • 数字
  •   数据库中的字段有:tinyint、smallint、int、bigint

18、models.TextField  

  • 大文本。默认对应的form标签是textarea。

19、models.TimeField  

  • 时间 HH:MM[:ss[.uuuuuu]]

20、models.URLField  

  • 一个带有URL合法性校验的CharField。

21、models.BinaryField  

  • 二进制
  • 存储二进制数据。不能使用filter函数获得QuerySet。

22、models.ImageField

  • 图片
  • ImageField.height_field、ImageField.width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。
  • 该字段要求 Python Imaging 库Pillow。
  • 会检查上传的对象是否是一个合法图片。

23、models.FileField(upload_to=None[, max_length=100, ** options])

  • 文件
  • FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置
  • 这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100

24、models.FilePathField(path=None[, math=None, recursive=False, max_length=100, **options])

  • FilePathField.path:文件的绝对路径,必填
  • FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。
  • FilePathField.recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。
  • 例如:FilePathField(path="/home/images", match="foo.*", recursive=True)

将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif”

2. django 模型models 字段常用参数

1、null

  • 如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False

2、blank

  •   如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。
  • null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的

3、primary_key = False

  •    主键,对AutoField设置主键后,就会代替原来的自增 id 列

4、auto_now 和 auto_now_add

  •   auto_now   自动创建---无论添加或修改,都是当前操作的时间
  •   auto_now_add  自动创建---永远是创建时的时间

5、choices

  • 一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框,
  • 并且限定choices的值是元组中的值
  • GENDER_CHOICE = (
  • (u'M', u'Male'),
  • (u'F', u'Female'),
  • )
  • gender = models.CharField(max_length=2,choices = GENDER_CHOICE)

6、max_length

  • 字段长度

7、default

  • 默认值

8、verbose_name  

  • Admin中字段的显示名称,如果不设置该参数时,则与属性名。

9、db_column  

  • 数据库中的字段名称

10、unique=True  

  • 不允许重复

11、db_index = True  

  • 数据库索引

12、editable=True  

  • 在Admin里是否可编辑

13、error_messages=None  

  • 错误提示

14、auto_created=False  

  • 自动创建

15、help_text  

  • 在Admin中提示帮助信息

16、validators=[]

  • 验证器

17、upload-to

  • 文件上传时的保存上传文件的目录

models.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.db import models

class UserInfo(models.Model):

userName = models.CharField(max_length=30)  #用户名

passWord = models.CharField(max_length=30)  #密码

gendle = models.BooleanField()  #性别

birthday = models.DateField()   #出生日期

weigth = models.FloatField()    #体重

heigth = models.IntegerField()  #身高

email = models.EmailField()     #邮箱

host = models.GenericIPAddressField()  #IP地址

introduce = models.TextField()  #个人简介

blog = models.URLField()        #博客地址

photo = models.ImageField()     #照片

CV = models.FilePathField()     #个人简历文件

createDate = models.DateTimeField()     #帐号申请时间

执行结果:


3.常见异常处理

1)

ERRORS:

web.UserInfo.photo: (fields.E210) Cannot use ImageField because Pillow is not installed.

HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install Pillow".

原因:

这是因为使用了ImageField()字段,该字段是直接在数据库中存储图片的,数据库中实际存储时要使用python的Pillow模块对图片进行处理后才能存储进去。因此因需使用pip install Pillow 安装该模块即可解决该报错。

2)             ERRORS:

在执行python manage.py makemigrations 时需要手动选择处理方法:

You are trying to add a non-nullable field 'CV' to userinfo without a default; we can't do that (the database                     needs something to populate existing rows).

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit, and let me add a default in models.py

Select an option: 1

Please enter the default value now, as valid Python

The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now

Type 'exit' to exit this prompt

>>> timezone.now

原因:

这是因为UserInfo数据表中已经有了"userName"和"passWord" 这两个字段,当在新增字段时就会出现这种Warning。是由于django框架在生成SQL语句时发现数据表不为空,担心新增不为Null的字段添加到该表中时,表中以前的数据行在填充这些字段时需要填充的值不明确,所以才会询问用户处理方式。

选1,则会在已存在行中添加null,选2,则会要求在models.py中添加默认值。

在models.py中设置默认值的方法:

host = models.GenericIPAddressField(default = '127.0.0.1')

3)  执行python makemigrations正常,但是执行python migrate 报错,之后再执行无法生效的处理办法

参照:http://blog.csdn.net/qq_25730711/article/details/60327344 处理。

谢谢两位博主!

Django models常用Field介绍以及常见错误解决相关推荐

  1. Django models部分,数据库建立,错误解决

    python manage.py showmigrations  结果,可以看到当前项目,所有的app及对应的已经生效的migration文件 python manage.py migrate –fa ...

  2. linux编译安装的报错,linux编译安装时常见错误解决办法

    This article is post on https://coderwall.com/p/ggmpfa 原文链接:http://www.bkjia.com/PHPjc/1008013.html ...

  3. Xampp配置本地域名及常见错误解决

    Xampp配置本地域名及常见错误解决 本地域名配置 1.计算机-->C盘-->Windows-->System32-->drivers-->etc-->hosts ...

  4. 普元EOS开发积累第一篇(常见错误解决方法) 持续更新

    普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...

  5. 日常工作问题解决:配置NTP服务器以及一些常见错误解决

    日常工作问题解决:配置NTP服务器以及一些常见错误解决 参考文章: (1)日常工作问题解决:配置NTP服务器以及一些常见错误解决 (2)https://www.cnblogs.com/yj411511 ...

  6. Spark程序运行常见错误解决方法以及优化

    Spark程序运行常见错误解决方法以及优化 参考文章: (1)Spark程序运行常见错误解决方法以及优化 (2)https://www.cnblogs.com/double-kill/p/901238 ...

  7. PHP编译安装时常见错误解决办法,php编译常见错误

    PHP编译安装时常见错误解决办法,php编译常见错误 1.configure: error: xslt-config not found. Please reinstall the libxslt & ...

  8. linux libvpx编译安装,linux编译安装时常见错误解决办法

    **configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution** 复 ...

  9. linux源码安装php缺少动态库,php源代码安装常见错误解决办法

    php源代码安装常见错误解决办法 错误:configure: error: libevent >= 1.4.11 could not be found 解决:yum -y install lib ...

最新文章

  1. 【ACM】POJ 1664
  2. java url 拦截_Spring mvc设置某些url不被interceptor拦截器拦截的方法
  3. 教你用PyTorch实现“看图说话”(附代码、学习资源)
  4. 程序员如何保持身心健康
  5. 【mDNS】本地DNS解析协议
  6. 搜狐视频Redis私有云cachecloud开源了
  7. 从功能层次,阐述CPU、接口和外设之间的交互
  8. 互联网日报 | 4月25日 星期日 | 我国首辆火星车命名为“祝融”;哈啰出行正式递交招股书赴美上市;快手搜索月活超2.5亿...
  9. 阿里CEO张勇:建立良好的消费环境是阿里20年来努力工作的方向
  10. vue踩坑以及自己的解决办法总结,
  11. Logstash自定义grok正则匹配规则
  12. Atitit.每月数据采集与备份 v4
  13. 计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...
  14. elastic APM针对java应用的高阶用法(java agent)
  15. Ubuntu连接不上网络问题的解决方法
  16. 移动端、PC端 网页特效
  17. 马克西尼的心流体验模型
  18. win10锁屏聚集图片不更新,右上角没有出现喜欢的按钮,怎么办?
  19. 织梦网站后台基本设置
  20. [更新幻灯]1剔除“伪创新”和“无领域”的领域驱动设计

热门文章

  1. 计算机二级考试场次是随机的,计算机二级考试知多少
  2. 6-3 读文章(*)
  3. 只可顺守不可逆取书法_关于如何练字,分享给想练好书法的人
  4. 供应链管理 | 华为是如何进行供应链规划与设计
  5. ASA广告投放策略:建立、更新你的关键词库
  6. “字体arial不支持样式regular“的解决方法
  7. StringPool详解
  8. Mac-homebrew使用(Mac下包管理工具)
  9. 数独问题之排除法和唯余法
  10. imputation文献-A systematic evaluation of single-cell RNA-sequencing imputation methods