ORM(二)常用字段小记
常用字段类型:
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(二)常用字段小记的更多相关文章
- day07 ORM中常用字段和参数
day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- Django (二) 常用字段及 ORM
MVC介绍 Django生命周期 many-to-many One-to-many Django常用字段 CharFiled 需要有max_length unique=True(代表不能重名) Ema ...
- Django ORM中常用字段和参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
- django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段
一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...
- Python - Django - ORM 不常用字段
BigAutoField(AutoField): bigint 自增列,必须填入参数 primary_key=True 如果没有写自增列,则会自动创建一个列名为 id 的列 SmallIntegerF ...
- Django框架之ORM常用字段
一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...
- Python--day68--Django ORM常用字段、不常用的字段、自定义字段
ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...
- Django中的ORM介绍,字段以及字段的参数。
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
随机推荐
- 可能是最全面的G1学习笔记
引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑,希望能够在这篇文章中得到解决. G1出现的初衷 ...
- V8引擎的垃圾回收策略
V8 的垃圾回收策略主要基于分代式垃圾回收机制.所谓分代式,就是将内存空间分为新生代和老生代两种,然后采用不同的回收算法进行回收. 新生代空间 新生代空间中的对象为存活时间较短的对象,大多数的对象被分 ...
- ASP.NET Aries 高级开发教程:Excel导入之多表高级导入配置(中)
前言: 在面对Excel的各种复杂导入情况中,多表导入是很常见的情景. 今天就来写一下多表导入是如何配置的. 1.自定义导入模板 怎么自定义: 其实就是自己新建一个Excel了,把列头都写好. 不过有 ...
- 微信小程序 base64 图片 canvas 画布 drawImage 实现
在微信小程序中 canvas drawImage API 传入的第一个参数是 imageResource 图片资源路径,这个参数通常由从相册选择图片 wx.chooseImage 或 wx.getIm ...
- img图片不存在显示默认图
在项目中,我们使用img标签加载图片,有时候图片地址有可能失效,获取路径问题,导致图片加载失败,img标签就会显示alt内容.这时候用户体验不是很好,所以就需要显示一张默认图片. 第一种方式:使用jq ...
- ansible copy 模块的使用
copy copy 模块是将 ansible 管理主机上的文件拷贝上远程主机中,与 fetch 相反,如果目标路径不存在,则自动创建,如果 src 的目录带“/” 则复制该目录下的所有东西,如果 sr ...
- Hadoop系列001-大数据概论
本人微信公众号,欢迎扫码关注! 大数据概论 1.大数据概念 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发 ...
- javascript权威指南笔记[1-5]
1.javaScript的数据类型分为两类:原始类型和对象类型: 2.javaScript中除了数字,字符串,布尔值,null,undefined之外就是对象了: 3.对象(object)是属性(pr ...
- 【机器学习】--GBDT算法从初始到应用
一.前述 提升是一种机器学习技术,可以用于回归和分类的问题,它每一步产生弱预测模型(如决策树),并加权累加到总模型中:如果每一步的弱预测模型的生成都是依据损失函数的梯度方式的,那么就称为梯度提升(Gr ...
- expect实现自动交互由浅入深
expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet ...