常用字段类型:

AutoField:字段自增,多用于ID主键字段,每个表中只能有一个AutoField字段类型。

id = models.AutoField(primary_key=True)  # 设置id字段为主键并自增长

AutoField字段是根据IntegerField类型自动递增的。而IntegerField的取值范围是:-2147483648到2147483647

BigAutoField:与AutoField功能相同都是自增,但是他的取值范围要更大:1到9223372036854775807

IntegerField:一个整数。取值范围-2147483648到2147483647。此字段的默认表单控件是 NumberInput当localize 为False或TextInput以其他方式。

BigIntegerField:一个64位整数,很像一个IntegerField不同之处在于它是保证从适合数字-9223372036854775808到 9223372036854775807。此字段的默认表单窗口小部件是a TextInput。

BinaryField:用于存储原始二进制数据的字段。它只支持bytes分配。请注意,此字段的功能有限。例如,无法过滤BinaryField值的查询集。也不可能在a BinaryField中包含a ModelForm。

PositiveIntegerField:像一个IntegerField,但必须是正数或零(0)。从价值观0到2147483647在Django支持的所有数据库的安全。0出于向后兼容性原因,接受该值。

BooleanField:真/假字段。此字段的默认表单窗口小部件是CheckboxInput。如果您需要接受null值,适用NullBooleanField。当Field.default 没有定义,默认值BooleanField是None。

NullBooleanField:像一个BooleanField,允许NULL作为选项之一。使用此而不是BooleanField使用null=True。此字段的默认表单窗口小部件是NullBooleanSelect。

CharField:字符串字段(varchar)。对于大量文本,请使用TextField。此字段的默认表单窗口小部件是TextInput。

CharField 有一个额外的必要参数:CharField(max_length=20)字段的最大长度(以字符为单位)。max_length在数据库级别和Django的验证中强制执行。

TextField:一个大的文本字段。此字段的默认表单窗口小部件是a Textarea。

如果指定max_length属性,它将反映在Textarea自动生成的表单字段的 窗口小部件中。但是,它不会在模型或数据库级别强制执行。

DateField:日期,由Python datetime.date实例表示。

有一些额外的可选参数:

  auto_now:每次保存对象时自动将字段设置为当前时间,该字段仅在Model.save()后,会更新该字段的日期。

  auto_now_add:首次创建对象时自动将字段设置为当前时间。此字段的默认表单窗口小部件是TextInput。管理员添加了一个JavaScript日历,以及“今天”的快捷方式。包含其他invalid_date错误消息密钥。选项auto_now_add,auto_now和default互相排斥。这些选项的任何组合都将导致错误。

DateTimeField:日期和时间,由Python datetime.datetime实例表示。采取相同的额外参数DateField。此字段的默认表单窗口小部件是单个 TextInput。管理员使用两个单独的 TextInput小部件和JavaScript快捷方式。

TimeField:一个时间,由Python datetime.time实例表示。接受相同的自动填充选项DateField。

此字段的默认表单窗口小部件是a TextInput。管理员添加了一些JavaScript快捷方式。

DecimalField:一个固定精度的十进制数,由Python Decimal实例表示。

有两个必需的参数:

DecimalField.max_digits:数字中允许的最大位数。请注意,此数字必须大于或等于decimal_places。

DecimalField.decimal_places:与数字一起存储的小数位数。

此字段的默认表单控件是NumberInput 当localize为False或 TextInput以其他方式。

DurationField:用于存储时间段的字段 - 用Python建模 timedelta。在PostgreSQL上使用时,使用interval的数据类型是Oracle,数据类型是。否则使用一微秒。INTERVAL DAY(9) TO SECOND(6)bigint

EmailField:CharField检查该值是否为有效电子邮件地址的A. 它用于EmailValidator验证输入。

FileField:文件上传字段。Django Admin以及ModelForm中提供读取文件夹下文件的功能

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

FilePathField:文件路径字段,字符串,路径保存在数据库,文件上传到指定目录

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

FloatField:由float实例在Python中表示的浮点数。此字段的默认表单控件是NumberInput 当localize为False或 TextInput以其他方式。

ImageField:从中继承所有属性和方法FileField,但也验证上载的对象是有效图像。

除了可用于特殊属性FileField,一个ImageField也具有height和width属性。

为了便于查询这些属性,ImageField有两个额外的可选参数:

ImageField.height_field:每次保存模型实例时,将使用图像高度自动填充的模型字段的名称。

ImageField.width_field:每次保存模型实例时,将使用图像宽度自动填充的模型字段的名称。

ImageField实例在数据库中创建为varchar 默认最大长度为100个字符的列。与其他字段一样,您可以使用max_length参数更改最大长度。

此字段的默认表单窗口小部件是a ClearableFileInput。

GenericIPAddressField:IPv4或IPv6地址,采用字符串格式(例如192.0.2.30或 2a02:42fe::4)。此字段的默认表单窗口小部件是TextInput。

GenericIPAddressField.protocol:限制指定协议的有效输入。可接受的值是'both'(默认),'IPv4' 或'IPv6'。匹配不区分大小写。

GenericIPAddressField.unpack_ipv4:解压缩IPv4映射地址,如::ffff:192.0.2.1。如果启用此选项,则该地址将被解压缩到 192.0.2.1。默认为禁用。只能在protocol设置为时使用'both'。如果允许空值,则必须允许空值,因为空值存储为空。

SlugField:Slug是一个报纸术语。slu is是一种短标签,只包含字母,数字,下划线或连字符。它们通常用于URL。

与CharField类似,您可以指定max_length(阅读有关数据库可移植性的说明以及max_length该部分中的说明)。如果max_length未指定,Django将使用默认长度50。

意味着设置Field.db_index为True。

基于某个其他值的值自动预填充SlugField通常很有用。您可以在管理员中自动执行此操作 prepopulated_fields。

SlugField.allow_unicode:如果True,该字段除ASCII字母外还接受Unicode字母。默认为False。

SmallIntegerField:像一个IntegerField,但只允许某个(数据库相关)点下的值。从价值观-32768到32767在Django支持的所有数据库的安全。

URLField:一个CharField一个网址。

此字段的默认表单窗口小部件是a TextInput。

与所有CharField子类一样,URLField采用可选 max_length参数。如果未指定 max_length,则使用默认值200。

UUIDField:用于存储通用唯一标识符的字段。使用Python的 UUID类。在PostgreSQL上使用时,它以uuid数据类型存储,否则存储在 char(32)。

通用唯一标识符是AutoFieldfor的 一个很好的替代品primary_key。数据库不会为您生成UUID,因此建议使用default:

import uuid
from django.db import models class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

关系字段:

ForeignKey:多对一的关系。需要两个位置参数:与模型相关的类和on_delete选项。(on_delete实际上并不需要,但不提供它会给出弃用警告。在Django 2.0中将需要它。)

要创建递归关系 - 与自身具有多对一关系的对象 - 使用。models.ForeignKey('self', on_delete=models.CASCADE)

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身:

ForeignKey.on_delete在django.db.models中的选项如下:

CASCADE:级联删除。Django模拟SQL约束ON DELETE CASCADE的行为,在删除关系表记录时,同时删除主表中的关系记录,删除主表外键记录时,不会影响关系表)。如下:

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.CASCADE) # CASCADE
def __str__(self):
return "{} - {}" .format(self.name)

如上主表Books,当通过Books对象删除Books表中记录时不会影响关系表Publishing表中的数据,但当Publishing对象删除publishing中记录时,会同时删除Books表中关联外键的记录。

PROTECT:删除引用的对象时,通过引发ProtectedError子类来 抛出异常django.db.IntegrityError。如下代码:

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.PROTECT) # PROTECT
def __str__(self):
return "{} - {}" .format(self.name)

当publishing对象删除与Books表中有关联的记录时,会引发异常,无法删除有引用的记录。需要先删除Books表中的外键引用记录后,才可以执行删除操作。

SET_NULL:只有null=True时,才可以设置这个选项,在删除引用表中与主表关联的记录时,将主表中外键关联记录设置为NULL。

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.SET_NULL,null=True) # SET_NULL
def __str__(self):
return "{} - {}" .format(self.name)

当publishing对象删除与Books表中有关联的记录时,会引将Books表中的外键引用记录设置为NULL。

SET_DEFAULT:与SET_NULL类似,只有default选项时,才能使用这个选项,在删除引用表中与主表关联的记录时,将主表中外键关联记录设置为default的默认值 。

DO_NOTHING:当删除主表外键,或者引用表记录时,不会影响到关联表。如果数据库后端设置了强制引用完整性,则会抛出IntegrityError异常,此时需要手动向数据库字段添加SQL ON DELETE约束。

SET():删除外键时,向关系表中传递SET(值或者是callable),如果传入 一个callable,则传递的是调用callable的结果。在大多数情况下,为了避免在导入models.py时执行查询,需要传递callable,官方示例:

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models 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),
)

我的示例:

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.SET(1)) # SET(1)
def __str__(self):
return "{} - {}" .format(self.name)

当publishing对象删除与Books表中有关联的记录时,会引将Books表中的外键引用记录设置为1。Books表中的删除操作不会影响publishing表。

ForeignKey.limit_choices_to:当这个字段使用在ModelForm或者Admin时,默认使用所有的queryset对象。可以使用limit_choices_to选项进行限制。limit_choices_to的值可以是一个字典,也可以是一个Q对象,或者是一个函数(函数返回一个字典)。官方示例:

staff_member = models.ForeignKey(
User,
on_delete=models.CASCADE,
limit_choices_to={'is_staff': True},
)

上述代码是当使用modelform时,仅列出User对象中有is_staff=True的用户。对使用Django admin很有帮助。

如果limit_choices_to的值是一个Q对象,那么在使用django admin时就不能使用 raw_id_fields,否则limit_choices_to将不生效,如下:

class Book(models.Model):
name = models.CharField(max_length=20)
user = models.ForeignKey(User, limit_choices_to={'is_staff': True}) # 使用limit_choices_to class BookAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'user']
raw_id_fields = ('user',) # 这样的话,limit_choices_to的作用就会失效。
admin.site.register(Book, BookAdmin)

ForeignKey.related_name:related_name的值主要是用于联表查询,如下示例:

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.DO_NOTHING,related_name='PUB')
def __str__(self):
return "{} - {}" .format(self.name)
----------------------------------------------------------------------------
# 通过主表Books获取Publishing对象
book_obj = models.Books.objects.get(筛选条件)
pub_obj = book_obj.pid # 获取publishing对象 # 通过publishing对象获取Books对象
pub_obj = models.Publishing.objects.get(筛选条件)
book_obj = pub_obj.PUB.all() # 对象.related_name.all()获取Books对象 # 如果主表Books的外键没有设置related_name,使用下面的方式获取Books对象
pub_obj = models.Publishing.objects.get(筛选条件)
book_obj = pub_obj.books_set.all().first()

如果您希望Django不创建向后关系(也就是被关联对象使用related_name来查此对象的信息),请将related_name=“+”或以“+”结束,将确保用户模型与此模型没有向后关系,这样将只可以从当前表查询被关联表,而不能从被关联表查询本表:

user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='+',
)

ForeignKey.related_query_name:用于目标模型的反向筛选器名称使用的名称。默认为related_name或default_related_name的值,否则默认为模型名称(说白了如果都不设置就是主表名),看下面的示例就好理解了:

from django.db import models

# Create your models here.
class Publishing(models.Model): # 关系表
pid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return "{}" .format(self.name)
class Books(models.Model): # 主表
bid = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
pid = models.ForeignKey("Publishing",on_delete=models.DO_NOTHING,related_query_name='PUB')
def __str__(self):
return "{} - {}" .format(self.name)
---------------------------------------------------------------------------- # 获取publishing对象,过滤条件使用books
pub_obj = models.Publishing.objects.filter(PUB__name='雪山飞狐') # 此时的PUB表示的是Books,通过PUB__name进行过滤 # 如果没有设置related_query_name等 获取publishing对象,过滤条件使用books
pub_obj = models.Publishing.objects.filter(books__name='雪山飞狐') # 这里直接使用books__name作为过滤条件

ForeignKey.to_field:关联子表上的字段。默认情况下,Django使用子表的主键。如果引用子表其他字段,则该字段必须具有unique=True。

ForeignKey.db_constraint:如果db_constraint=True为外键设置外键约束,如果为False不对外键进行约束,访问不存在的引用对象将引发其DoNoTeXistRebug。

ForeignKey.swappable:这个不是很清楚,应该是两个models进行的外键关联。如果此外键指向可交换模型,则反应了控制框架的迁移。默认为True,如果ForeignKey指向与settings.AUTH_USER_model(或另一个可交换模型设置)的当前值匹配的模型,则关系将使用对该设置的引用(而不是直接指向模型)存储在迁移中。

如果您确定您的模型应该始终指向已交换的模型(例如,如果它是专门为您的自定义用户模型设计的配置文件模型),则只希望将其重写为False。

将其设置为False并不意味着您可以引用可交换的模型,即使它已被交换出去-False只是意味着使用此ForeignKey进行的迁移将始终引用您指定的确切模型(例如,如果用户尝试使用不支持的用户模型运行,则很难失败)。如果有疑问,让它默认为真。

ManyToManyField:

多对多的关系。需要一个位置参数:模型所关联的类,其工作方式与ForeignKey完全相同,包括递归和惰性关系。可以使用字段的RelatedManager添加、删除或创建相关对象。

在数据库表示中,Django创建一个中间连接表来表示多对多关系。默认情况下,此表名是使用多对多字段的名称和包含该字段的模型的表名生成的。由于某些数据库不支持超过一定长度的表名,这些表名将自动截断为64个字符,并将使用唯一性哈希。这意味着您可能会看到类似author_9cdf4的表名;这是非常正常的。可以使用db_table选项手动提供联接表的名称。

OneToOneField:一对一的关系。从概念上讲,这类似于 ForeignKeywith unique=True,但关系的“反向”方面将直接返回单个对象。

这作为模型的主键是最有用的,它以某种方式“扩展”另一个模型; 例如,通过从子模型向父模型添加隐式一对一关系来实现多表继承。

需要一个位置参数:与模型相关的类。这与它的工作方式完全相同ForeignKey,包括有关递归 和惰性关系的所有选项。

如果没有related_name为其指定参数OneToOneField,Django将使用当前模型的小写名称作为默认值。

自定义类型

如果觉得orm提供的数据类型不能满足需求,可以自定义数据类型。如下定义一个char数据类型:

class MyCharField(models.Field):
"""
自定义的char类型的字段类
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection):
"""
限定生成数据库表的字段类型为char,长度为max_length指定的值
"""
return 'char(%s)' % self.max_length class Temp(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=25) # ORM自带数据类型
# 使用自定义的char类型的字段
cname = MyCharField(max_length=25) # 使用自定义字段类型

自定义字段类型

执行迁移命令

python37 manage.py makemigrations

python37 manage.py migrate

最终生成表如下:

在数据库中查看如下:

参考文档:https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.AutoField

参考文档:https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.Field.error_messages

参考文档:https://docs.djangoproject.com/en/1.11/topics/db/queries/#backwards-related-objects

##############################################################################

字段就简单到这里,关于字段里的参数,在以后的实例中用到在具体解释。下一章表的字段操作

##############################################################################

ORM(二)常用字段小记的更多相关文章

  1. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  2. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  3. Django (二) 常用字段及 ORM

    MVC介绍 Django生命周期 many-to-many One-to-many Django常用字段 CharFiled 需要有max_length unique=True(代表不能重名) Ema ...

  4. Django ORM中常用字段和参数

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

  5. django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段

    一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...

  6. Python - Django - ORM 不常用字段

    BigAutoField(AutoField): bigint 自增列,必须填入参数 primary_key=True 如果没有写自增列,则会自动创建一个列名为 id 的列 SmallIntegerF ...

  7. Django框架之ORM常用字段

    一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...

  8. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

  9. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

随机推荐

  1. 安卓开发笔记(二十):利用夜神模拟器调试运行Android Studio的apk

    一.首先来到夜神模拟器的安装目录下 如下图所示: 再把这整个文件夹添加到我们的windows环境变量里.然后再把android studio 和夜神模拟器都打开,注意必须同时打开而且不能够把夜神模拟器 ...

  2. ionic cordova build android error: commamd failed with exit code eacces

    问题: 电脑的gradle版本为Gradle 5.0,然而 因为 添加的android 平台为6.3.0 gradle 是 4.1版本 电脑已存在 gradle的情况下,add platform 成功 ...

  3. 有关Windows10中诊断和反馈隐私设置

    当你使用 Windows 时,我们将收集诊断信息,为了确保能收到你(我们的客户)的反馈,我们为你提供了多种方式,以便你可以随时发送反馈,也可以在某个特定的时间(例如当 Windows 10 向你提出关 ...

  4. Windows Server 2016-客户端退域的三种方法

    前边我们提到了客户端加域的操作方法,本章为大家补充域客户端退域的操作过程,包含图形化.netdom remove.Powershell三种方法,具体内容如下: 图形化退域方法: 1.Win键,计算机右 ...

  5. SCSS & SASS Color 颜色函数用法

    最近做一个没有设计师参与的项目,发现 scss 内置的颜色函数还挺好用.记录分享下 rgba() 能省掉手工转换 hex 到 rgb 格式的工作,如以下 SCSS 代码 $linkColor: #20 ...

  6. 阿里云服务器建站——centos7部署apache+mysql+php

    自己也是忙活了半天,才完成了阿里云服务器的建站,这里就来分享一下. 首先如果是要自己搭建一个网站的话,除了服务器以外还要购买域名,并且要去备案,一般在哪买的域名都有备案的系统,备案的话一般要两到三个星 ...

  7. Python 进度条显示

    运行工具:Pycharm, import timescale = 50print("开始执行".center(scale//2,"-")) start = ti ...

  8. 从零开始学习PYTHON3讲义(九)字典类型和插入排序

    <从零开始PYTHON3>第九讲 第六讲.上一讲我们都介绍了列表类型.列表类型是编程中最常用的一种类型,但也有挺明显的缺陷,比如: data = [5,22,34,12,87,67,3,4 ...

  9. KeyboardUtil【软键盘弹出后输入框上移一定的高度】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 演示获取软键盘高度并保存,然后根据输入框的原有位置是否被软键盘挡住了,如果被挡住了则将整体页面上移一定的高度,当软键盘隐藏的时候再下 ...

  10. Springboot整合Elastic-Job(二)

    上文我们讲到Springboot整合Elastic-Job整合的demo,只是简单的实现了主要功能.本文在上文基础上,进行新的调整. 事件追踪 Elastic-Job提供了事件追踪功能,可通过事件订阅 ...