django数据模型(Model)的字段类型解析


Posted in Python onDecember 25, 2019

字段类型(Field types)

1、AutoField

它是一个根据 ID 自增长的 IntegerField 字段。通常,你不必直接使用该字段。如果你没在别的字段上指定主 键,Django 就会自动添加主键字段。

2、BigIntegerField

64位整数,类似于IntegerField,范围从-9223372036854775808 到9223372036854775807。默认的form widget 是TextInput。

3、BooleanField

一个布尔值(true/false)字段。
默认的form widget是CheckboxInput。
如果要使用null作为空值,可使用NullBooleanField。

4、CharField

class CharField(max_length=None[, **options])
它是一个字符串字段,对小字符串和大字符串都适用。
对于更大的文本,应该使用TextField 。
默认的form widget是TextInput。
CharField 有一个必须传入的参数:max_length,字段的最大字符数。它作用于数据库层级和 Django 的数据验证层级。

5、DateField

class DateField([auto_now=False, auto_now_add=False, **options])
该字段利用 Python 的 datetime.date 实例来表示日期。下面是它额外的可选参数:
DateField.auto_now:每一次保存对象时,Django 都会自动将该字段的值设置为当前时间。一般用来表示 "最后修改" 时间。要注意使用的是当前日期,而并非默认值,所以
不能通过重写默认值的办法来改变保存时间。
DateField.auto_now_add:在第一次创建对象时,Django 自动将该字段的值设置为当前时间,一般用来表示对象创建时间。它使用的同样是当前日期,而非默认值。
默认的form widget是TextInput。
Note:当auto_now或者auto_now_add设置为True时,字段会有editable=True和blank=True的设定。

6、DateTimeField

class DateTimeField([auto_now=False, auto_now_add=False, **options])
该字段利用 datetime.datetime 实例表示日期和时间。该字段所按受的参数和 DateField 一样。
默认的form widget是TextInput。Django 的admin使用两个带有 JavaScript 快捷选项TextInput分别表示日期和时间。

7、DecimalField

class DecimalField(max_digits=None, decimal_places=None[, **options])
它是使用 Decimal 实例表示固定精度的十进制数的字段。它有两个必须的参数:
DecimalField.max_digits:数字允许的最大位数
DecimalField.decimal_places:小数的最大位数
例如,要存储的数字最大值是999,而带有两个小数位,你可以使用:

models.DecimalField(..., max_digits=5, decimal_places=2)
要存储大约是十亿级且带有10个小数位的数字,就这样写:
models.DecimalField(..., max_digits=19, decimal_places=10)

8、EmailField

class EmailField([max_length=75, **options])
它是带有 email 合法性检测的A CharField 。
Note:最大长度默认为75,并不能存储所有与RFC3696/5321兼容的email地址。如果要存储所有,请设置
max_length=254。设置为75是历史遗留问题。

9、TextField

class TextField([**options])
大文本字段。默认的form widget是Textarea。

ps:下面看下django数据模型on_delete, db_constraint的使用

# 半夜撸代码  正在一顿操作猛如虎的时候,发现删了其中一张表的某条记录,结果发现其他表跟这个字段的关联的也都被删除,我已经写了db_constraint=False 难道我用错了,最后只能查资料,原来想断关联还想连表查询做这个是不够的,还需要null=True, blank=True,on_delete=models.SET_NUL这里我之前写的是on_delete=models.CASCADE 默认级联删除,坑了自己一把,还有昨天晚上也是,后台写好,万事具备的时候,准备开撸前台,ajax请求就是不通,各种改地址 端口,最后居然是配置里'corsheaders.middleware.CorsMiddleware'这个没加,唉,撸个代码配环境还要配几个小时?

1.设置为null

class BookModel(models.Model):
 """
 图书
 """
 book_name = models.CharField(max_length=100, verbose_name='书名')
 # 表示外键关联到作者表,当作者表删除了该条数据,图书表中不删除,仅仅是把外键置空
 author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
 price = models.FloatField(verbose_name='价格')
 create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')

2.建表时其他参数的设置

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

3.set的使用

def get_sentinel_user():
 return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
 user = models.ForeignKey(
  settings.AUTH_USER_MODEL,
  on_delete=models.SET(get_sentinel_user),
 )

4.ManyToMany参数(through,db_constraint)

class Book(models.Model):
 name=models.CharField(max_length=20)
 authors=models.ManyToMany('Author',through='Score')
class Author(models.Model):
 name=models.CharField(max_length=20)
class Score(models.Model):
 book=models.ForeignKey('Book')
 author=models.ForeignKey('Author')
 socre=models.IntegerField()
#######

如果只写manytomany,那么第三张是Django替我们建的,可以通过book.authors字段进行一系列操作(add(增),all(查),set(重置),remove(删除)),但是此时没法给第三张表加其他我们需要的字段,

而如果不写,ManyToMany字段,那么我们可以通过Score来执行一些操作,但是此时book和author表已经没有直接的联系了,查询起来很繁琐

有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便业务,添加需要的字段

5.db_constraint

db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一般公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)
limit_choices_to
限制关联字段的对象范围
related_name
反向查询字段可以不用 表名小写,可以改名了
db_table
第三张表的名字
 models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL,db_constraint=False)

5.总结

如果使用两个表之间存在关联,首先db_constraint=False 把关联切断,但保留连表查询的功能,其次要设置null=True, blank=True,

总结

以上所述是小编给大家介绍的django数据模型(Model)的字段类型解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Django卸载之后重新安装的方法
Mar 15 Python
Python解惑之整数比较详解
Apr 24 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
python解释器spython使用及原理解析
Aug 24 Python
Python笔记之观察者模式
Nov 20 Python
python 多维高斯分布数据生成方式
Dec 09 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
Tensorflow tf.tile()的用法实例分析
May 22 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
python3实现无权最短路径的方法
May 12 Python
python装饰器的特性原理详解
Dec 25 #Python
Python将列表中的元素转化为数字并排序的示例
Dec 25 #Python
python中的subprocess.Popen()使用详解
Dec 25 #Python
python打印n位数“水仙花数”(实例代码)
Dec 25 #Python
python中有关时间日期格式转换问题
Dec 25 #Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 #Python
Python和Sublime整合过程图示
Dec 25 #Python
You might like
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
python爬虫headers设置后无效的解决方法
2017/10/21 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
德国PC硬件网站:CASEKING
2016/10/20 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
交通事故检查书范文
2014/01/30 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
公司贷款承诺书
2014/05/30 职场文书
运动会演讲稿300字
2014/08/25 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
优秀班集体申报材料
2014/12/25 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript