Django中的AutoField字段使用

【Django是一个机智的框架】

默认情况下Djang会为ORM中定义的每一张表加上一个自增ID列,并且用这个列来做主键;出于一个MySQL-DBA的工作经历我觉得

Djanog还真是机智;这样么说主要是因为我遇到过许多主从延时的问题,有些比较过分的会延时好几周,通常这些都是因为binlog格式

为“ROW”但是表上不存在主键引起的。

如果当前网站用的是Django开发的,我想就不会有这种事情发生了吧。

【AutoField】

Django默认的行为就像这样

class TestModel(models.Model):
id = models.AutoField(primary_key=True)

数据库层面对应的SQL如下

CREATE TABLE `myapp_testmodel` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

【注意】

如果你想的工增加AutoField列,但是又不指定这个列做为主键的话,是会报错的

class TestModel(models.Model):
tid = models.AutoField()

不显示指定主键,但是又给表增加AutoField列的话就会报错

assert not cls._meta.auto_field, "Model %s can't have more than one AutoField." % cls._meta.label
AssertionError: Model myapp.TestModel can't have more than one AutoField.

补充知识:Django中models下常用Field以及字段参数

一、常见的FieldType数据库字段类型

1、AutoField:自增Field域,自动增加的一个数据库字段类型,例如id字段就可以使用该数据类型,参数中必须填入primary_key=True

2、BigAutoField:和AutoField相同,只是比AutoField要大,参数中必须填入primary_key=True

3、BigIntegerField:大整型,只要用于存储整型的数据

4、BinaryField:主要是存储原始的二进制数据

5、BooleanField:主要是存储布尔类型的数据,0和1

6、CharField:主要存储字符串的数据类型

7、DateField:主要存储日期类型的数据类型,日期格式为YYYY-MM-DD

8、DateTimeField:主要存储时间相关的数据类型,格式为YYYY-MM-DD HH:MM:[ss[.uuuuuu]][TZ]

注意:DateField与DateTimeField有两个属性,配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库,配置auto_now=True,每次更新数据记录的时候都会更新该字段

9、DecimalField:主要存储固定精度的十进制数据

--参数:max_digits(小数总长度)/decimal_places(小数位长度)

10、EmailField:存储电子邮件格式的数据,Django Admin以及ModelForm中提供验证机制

11、FileField:存储文件类型的数据,文件上传到指定目录

--参数:upload_to="...."(上传文件的保存路径)/storage=None(存储组件,默认django.core.files.storage.FileSystemStorage)

12、FilePathField:存储文件路径的数据,提供读取文件夹下文件的功能

--参数:path(文件夹路径)/match=None(正则匹配)/recursive=False(递归下面的文件夹)/allow_files=True(允许文件)/allow_folders=False(允许文件夹)

13、FloatField:存储浮点型数据

14、ImageField:存储图片型数据,文件上传到指定目录

--参数:upload_to="....."(上传文件的保存路径)/storage=None(存储组件,默认django.core.files.storage.FileSystemStorage)/width_field=None(上传图片的宽度保存的数据库字段名<字符串>)/height_field=None(上传图片的高度保存的数据库字段名<字符串>)

15、IntegerField:存储整型数据

16、GenericIPAddressField:存储IP地址信息数据

17、NullBooleanField:可以存储布尔值数据,也可以存储空null数据

18、PositiveIntegerField:主要存储正整数数据

19、SmallIntegerField:小整型,主要用于存储整型的数据

20、TextField:存储文章内容信息数据,存储比较长的文本信息

21、TimeField:存储时间信息

22、URLField:存储URL网址信息,Django Admin以及ModelForm中提供验证url

23、IPAddressField:Django Admin以及ModelForm中提供验证IPV4机制

24、GenericIPAddressField:Django Admin以及ModelForm中提供验证IPV4和IPV6机制

二、常用关系型数据表处理Field

1、处理一对多关系数据表:使用ForeignKey

2、处理多对多关系数据表:使用ManyToManyField

三、字段参数

1、null:用于表示某个字段可以为空

2、unique:如果设置为unique=True则该字段在此表中必须是唯一的

3、db_index:如果db_index=True则代表这为此字段设置索引

4、default:为该字段设置默认值

四、关系字段

1、to:设置要关联的表

2、to_field:设置要关联的表的字段

3、related_name:反向操作时,使用的字段名,用于代替原反向查询时的"表名_set"

4、on_delete:当删除关联表中的数据时,当前表与其关联的行的行为,例如删除一个出版社,那么和这个出版社有关联的书籍也都被删除掉了,下面介绍on_delete的参数值:

on_delete=models.CASCADE:删除关联数据,与之关联也删除

on_delete=models.DO_NOTHING:删除关联数据,引发错误IntegrityError

on_delete=models.PROTECT:删除关联数据,引发错误ProtectedError

on_delete=models.SET_NULL:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

on_delete=models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

on_delete=models.SET:删除关联数据:

a、与之关联的值设置为指定值,设置:models.SET(值)

b、与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

5、db_constraint:是否在数据库中创建外键约束,默认为True,db_constraint一般使用在建立数据表连接关系当中(例如创建外键),如果使用False,则是限制了表之间没有关联,达到了软连接的效果

五、元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息,主要字段如下:

1、db_table:ORM在数据库中的表名默认为app_类名,可以通过db_table可以重写表名

2、index_together:联合索引,给两列做索引

3、unique_together:联合唯一索引,两列不能重复

4、ordering:指定默认按什么字段顺序,只有设置了该属性,我们查询到的结果才可以被reverse()

具体介绍可以查看https://docs.djangoproject.com/en/dev/ref/models/fields/

以上这篇Django中的AutoField字段使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 基于django 的orm中非主键自增的实现方式

    我们知道django的orm想实现自增,可以直接使用AutoField字段既可以实现,但是这种情况必须要求此字段是主键,但是我们知道主键只能是一个. 如果我已经有了一个主键,但是又需要另外一个字段为唯一自增字段,这该如何实现呢? 本人的解决办法如下,供大家参考,也欢迎大家提供更多的实现方式,互相学习. class ProductSpu(models.Model): """ 商品表 """ _database = 'payment' id = mo

  • Django ORM 查询表中某列字段值的方法

    1.什么是ORM ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 在MVC/MVT设计模式中的Model模块中都包括ORM 2.ORM优势 (1)只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句. (2)实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异. 不在关注用的是mysql.oracle...等. 通过简单的配置就可以轻松更换数据库, 而不需要修改代码. 3.

  • django创建超级用户时指定添加其它字段方式

    使用 python manage.py createsuperuser创建超级用户时只能默认输入:用户名,邮箱,及密码来创建 有的时候我们需要创建的时候指定额外的字段,可以通过下面的方法 使用 python manage.py shell 进入shell脚本 在shell脚本中 from users.models import User User.objects.create_superuser('用户名','邮箱','密码',mobile=19111111111) # User.objects

  • 关于Django Models 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

  • Django对models里的objects的使用详解

    首先我们先熟悉下objects的大致概念. object是模型属性---用于模型对象和数据库交互 . objects = Manager() 是管理器类型的对象 ,是Model和数据库进行查询的接口. objects : 管理器对象 是Manager类型的对象,定义在from django.db import models中 用于模型对象和数据库交互 是默认自动生成的属性,但是可以自定义管理器对象 实例: class Students(models.Model): # stuobj = mode

  • Django中的AutoField字段使用

    [Django是一个机智的框架] 默认情况下Djang会为ORM中定义的每一张表加上一个自增ID列,并且用这个列来做主键:出于一个MySQL-DBA的工作经历我觉得 Djanog还真是机智:这样么说主要是因为我遇到过许多主从延时的问题,有些比较过分的会延时好几周,通常这些都是因为binlog格式 为"ROW"但是表上不存在主键引起的. 如果当前网站用的是Django开发的,我想就不会有这种事情发生了吧. [AutoField] Django默认的行为就像这样 class TestMod

  • 在django中实现choices字段获取对应字段值

    我就废话不多说了,大家还是直接看代码吧~ class Area(models.Model): Area_Level = ( (0, u'全国'), (1, u'省.直辖市'), (2, u'市.直辖市区'), (3, u'区.县等'), ) areaname = models.CharField(max_length=30,unique=True, verbose_name='区域名称') code = models.CharField(max_length=20,blank=True, def

  • django中ORM模型常用的字段的使用方法

    与数据类型相关的字段 CharField         作用:字符串字段, 用于较短的字符串.         参数:CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. IntegerField        作用:用于保存一个整数. CommaSeparatedIntegerField         作用:用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数. FloatField

  • Django中模型Model添加JSON类型字段的方法

    本文实例讲述了Django中模型Model添加JSON类型字段的方法.分享给大家供大家参考.具体如下: Django里面让Model用于JSON字段,添加一个JSONField自动类型如下: class JSONField(models.TextField): __metaclass__ = models.SubfieldBase description = "Json" def to_python(self, value): v = models.TextField.to_pytho

  • 在django中自定义字段Field详解

    Django的Field类中方法有: to_python() # 把数据库数据转成python数据 from_db_value() # 把数据库数据转成python数据 get_pre_value() # 把python数据压缩准备存入数据库 get_db_pre_value() # 把压缩好的数据转成数据库查询集 get_prep_lookup() # 指定过滤的条件 value_to_string() # 数据序列化 如果创建的Field比字符串,日期,整数等更复杂的数据结构,可能需要重写t

  • django xadmin中form_layout添加字段显示方式

    需求: 用的是django的框架,想显示一个基本固定的页面,用到了form_layout 上图的ROW中添加的是model中的字段名,可以显示对应的内容,如果想一行显示多个,可以写成 Row('Flow_type', 'Demand_name'),效果如下图(图片是别人的,借鉴一下) 想正常的显示,还有最后一步就是在把你需要展示的ROW中的字段,放在fields中(部分截取了一下) 补充知识:xadmin 编辑页隐藏字段 引用xadmin 的fieldSet 对不想显示的字段添加**{"styl

  • django 模型中的计算字段实例

    models.py class Person(models.Model): family_name= models.CharField(max_length=20, verbose_name='姓') given_name = models.CharField(max_length=20, verbose_name='名') def name(self): # 计算字段要显示在修改页面中只能定义在只读字段中(否则不显示):readonly_fields = ('sc',) return '%s,

  • Django中FilePathField字段的用法

    class FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) 一个 CharField ,内容只限于文件系统内特定目录下的文件名.有三个参数, 其中第一个是 必需的: FilePathField.path 必填.这个FilePathField 应该得到其选择的目录的绝对文件系统路径.例如: "/home/images". FilePathField.match 可选的.F

  • Django中日期时间型字段进行年月日时分秒分组统计

    1.数据结构说明: 数据结构如下:modification字段为修改数据时间字段,格式为 年,月,日,时,分,秒. 案例场景为,根据modification字段,统计每个统计粒子,产生数据的条数.如需要统计2020年10月29日 每个小时段产生数据的条数. 要进行这种统计需要用到 Django的connection库. 统计年月日粒子用 date_trunc_sql,统计时分秒用 datetime_extract_sql 2.进行年月日粒子的统计  2.1 官方 date_trunc_sql 原

随机推荐