Django(三⼗⼀)——DjangoORM常⽤字段类型Django ORM常⽤字段类型
类型说明
AutoField ⼀个⾃动增加的整数类型字段。通常你不需要⾃⼰编写它,Django会⾃动帮你添加字段:id =
models.AutoField(primary_key=True),这是⼀个⾃增字段,从1开始计数。如果你⾮要⾃⼰设置主键,那么请务必将字段设置为primary_key=True。Django在⼀个模型中只允许有⼀个⾃增字段,并且该字段必须为主键!
BigAutoField64位整数类型⾃增字段,数字范围更⼤,从1到9223372036854775807
BigIntegerField 64位整数字段(看清楚,⾮⾃增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单⾥体现为⼀个NumberInput标签。
BinaryField⼆进制数据类型。较少使⽤。
BooleanField布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果设置了参数null=True,则表现为NullBooleanSelect选择框。可以提供default参数值,设置默认值。
CharField最常⽤的类型,字符串类型。必须接收⼀个max_length参数,表⽰字符串长度不能超过该值。默认的表单标签是text input。
DateField class DateField(auto_now=False, auto_now_add=False, **options) , ⽇期类型。⼀个Python中的datetime.date的实例。在HTML中表现为DateInput标签。在admin后台中,Django会帮你⾃动添加⼀个JS⽇历表和⼀个“Today”快捷⽅式,以及附加的⽇期合法性验证。两个重要参数:(参数互斥,不能共存)auto_now:每当对象被保存时将字段设为当前⽇期,常⽤于保存最后修改时间。auto_now_add:每当对象被创建时,设为当前⽇期,常⽤于保存创建⽇期(注意,它是不可修改的)。设置上⾯两个参数就相当于给field添加了editable=False和blank=True属性。如果想具有修改属性,请⽤default参数。例⼦:pub_time = models.DateField(auto_now_add=True),⾃动添加发布时间。
DateTimeField⽇期时间类型。Python的datetime.datetime的实例。与DateField相⽐就是多了⼩时、分和秒的显⽰,其它功能、参数、⽤法、默认值等等都⼀样。
DecimalField 固定精度的⼗进制⼩数。相当于Python的Decimal实例,必须提供两个指定的参数!参数max_digits:最⼤的位数,必须⼤于或等于⼩数点位数。decimal_places:⼩数点位数,精度。当localize=False时,它在HTML表现为NumberInput标签,否则是textInput类型。例⼦:储存最⼤不超过999,带有2位⼩数位精度的数,定义如下:models.DecimalField(..., max_digits=5, decimal_places=2)。
DurationField持续时间类型。存储⼀定期间的时间长度。类似Python中的timedelta。在不同的数据库实现中有不同的表⽰⽅法。常⽤于进⾏时间之间的加减运算。但是⼩⼼了,这⾥有坑,PostgreSQL等数据库之间有兼容性问题!
EmailField邮箱类型,默认max_length最⼤长度254位。使⽤这个字段的好处是,可以使⽤Django内置的EmailValidator进⾏邮箱格式合法性验证。
FileField class FileField(upload_to=None, max_length=100, **options)上传⽂件类型,后⾯单独介绍。
FilePathField⽂件路径类型,后⾯单独介绍
FloatField浮点数类型,对应Python的float。参考整数类型字段。
ImageField图像类型,后⾯单独介绍。
IntegerField整数类型,最常⽤的字段之⼀。取值范围-2147483648到2147483647。在HTML中表现为NumberInput或者TextInput标签。
GenericIPAddressField class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options),
IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4。在HTML中表现为TextInput标签。参数protocol默认值为‘both’,可选‘IPv4’或者‘IPv6’,表⽰你的IP地址类型。
JSONField JSON类型字段。Django3.1新增。签名为class JSONField(encoder=None,decoder=None,**options)。其中的encoder和decoder为可选的编码器和解码器,⽤于⾃定义编码和解码⽅式。如果为该字段提供default值,请务必保证该值是个不可变的对象,⽐如字符串对象。
PositiveBigIntegerField正的⼤整数,0到9223372036854775807 PositiveIntegerField正整数,从0到2147483647 PositiveSmallIntegerField较⼩的正整数,从0到32767
SlugField slug是⼀个新闻⾏业的术语。⼀个slug就是⼀个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常⽤于URLs中。可以设置max_length参数,默认为50。
SmallAutoField Django3.0新增。类似AutoField,但是只允许1到32767。SmallIntegerField⼩整数,包含-32768到32767。
TextField ⽤于储存⼤量的⽂本内容,在HTML中表现为Textarea标签,最常⽤的字段类型之⼀!如果你为它设置⼀个max_length参数,那么在前端页⾯中会受到输⼊字符数量限制,然⽽在模型和数据库层⾯却不受影响。只有CharField才能同时作⽤于两者。
TimeField时间字段,Python中datetime.time的实例。接收同DateField⼀样的参数,只作⽤于⼩时、分和秒。URLField⼀个⽤于保存URL地址的字符串类型,默认最⼤长度200。
UUIDField⽤于保存通⽤唯⼀识别码(Universally Unique Identifier)的字段。使⽤Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是⾃增主键的最佳替代品,后⾯有例⼦展⽰。
1.FileField
class FileField(upload_to=None, max_length=100, default=None, **options)
上传⽂件字段。默认情况下,该字段在HTML中表现为⼀个ClearableFileInput标签。在数据库内,我们实际保存的是⼀个字符串类型,默认最⼤长度100,可以通过max_length参数⾃定义。真实的⽂件是保存在服务器的⽂件系统内的。
定义好upload_to参数,⽂件最终会放在MEDIA_ROOT⽬录upload_to⼦⽬录中, default表⽰⽤户没有指定则⽤MEDIA_ROOT⽬录下的default⽂件
重要参数upload_to⽤于设置上传地址的⽬录和⽂件名。如下例所⽰:
class MyModel(models.Model):
# ⽂件被传⾄`MEDIA_ROOT/uploads`⽬录,MEDIA_ROOT由你在settings⽂件中设置
upload = models.FileField(upload_to='uploads/')
# 或者
# 被传到`MEDIA_ROOT/uploads/2015/01/30`⽬录,增加了⼀个时间划分
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
Django很⼈性化地帮我们实现了根据⽇期⽣成⽬录或⽂件的⽅式!
upload_to参数也可以接收⼀个回调函数,该函数返回具体的路径字符串,如下例:
def user_directory_path(instance, filename):
#⽂件上传到MEDIA_ROOT/user_<id>/<filename>⽬录中
return 'user_{0}/{1}'.format(instance.user.id, filename)
django admin 自定义页面class MyModel(models.Model):
upload = models.FileField(upload_to=user_directory_path)
例⼦中,user_directory_path这种回调函数,必须接收两个参数,然后返回⼀个Unix风格的路径字符串。参数instace代表⼀个定义了FileField的模型的实例,说⽩了就是当前数据记录。filename是原本的⽂件名。
从Django3.0开始,⽀持使⽤pathlib.Path处理路径。
当你访问⼀个模型对象中的⽂件字段时,Django会⾃动给我们提供⼀个 FieldFile实例作为⽂件的代理,通过这个代理,我们可以进⾏⼀些⽂件操作,主要如下:
FieldFile.name :获取⽂件名
FieldFile.size:获取⽂件⼤⼩
FieldFile.url :⽤于访问该⽂件的url
FieldFile.open(mode='rb'):以类似Python⽂件操作的⽅式,打开⽂件
FieldFile.close():关闭⽂件
FieldFile.save(name, content, save=True):保存⽂件
FieldFile.delete(save=True):删除⽂件
这些代理的API和Python原⽣的⽂件读写API⾮常类似,其实本质上就是进⾏了⼀层封装,让我们可以在Django内直接对模型中⽂件字段进⾏读写,⽽不需要绕弯⼦。
2. FilePathField
class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)
⼀种⽤来保存⽂件路径信息的字段。在数据表内以字符串的形式存在,默认最⼤长度100,可以通过max_length参数设置。
它包含有下⾯的⼀些参数:
path:必须指定的参数。表⽰⼀个系统绝对路径。path通常是个字符串,也可以是个可调⽤对象,⽐如函数。
match:可选参数,⼀个正则表达式,⽤于过滤⽂件名。只匹配基本⽂件名,不匹配路径。例如foo.*\.txt$,只匹配⽂件名,不匹配与foo23.png。
recursive:可选参数,只能是True或者False。默认为False。决定是否包含⼦⽬录,也就是是否递归的意思。
allow_files:可选参数,只能是True或者False。默认为True。决定是否应该将⽂件名包括在内。它和allow_folders其中,必须有⼀个为True。
allow_folders:可选参数,只能是True或者False。默认为False。决定是否应该将⽬录名包括在内。
⽐如:
FilePathField(path="/home/images", match="foo.*", recursive=True)
它只匹配/home/images/foo.png,但不匹配/home/images/foo/bar.png,因为默认情况,只匹配⽂件名,⽽不管路径是怎么样的。
例⼦:
import os
f import settings
from django.db import models
def images_path():
return os.path.join(settings.LOCAL_FILE_DIR, 'images')
class MyModel(models.Model):
file = models.FilePathField(path=images_path)
3. ImageField
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
⽤于保存图像⽂件的字段。该字段继承了FileField,其⽤法和特性与FileField基本⼀样,只不过多了两个属性height和width。默认情况下,该字段在HTML中表现为⼀个ClearableFileInput标签。在数据库内,我们实际保存的是⼀个字符串类型,默认最⼤长度100,可以通过max_length参数⾃定义。真实的图⽚是保存在服务器的⽂件系统内的。
height_field参数:保存有图⽚⾼度信息的模型字段名。width_field参数:保存有图⽚宽度信息的模型字段名。
使⽤Django的ImageField需要提前安装pillow模块,pip install pillow即可。
4. UUIDField
数据库⽆法⾃⼰⽣成uuid,因此需要如下使⽤default参数:
import uuid # Python的内置模块
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# 其它字段
注意不要写成default=uuid.uuid4()
5.FileField与ImageField注意点
1. 在settings⽂件中,配置MEDIA_ROOT,作为你上传⽂件在服务器中的基本路径(为了性能考虑,这些⽂件不会被储存在数据库中)。
再配置个MEDIA_URL,作为公⽤URL,指向上传⽂件的基本路径。请确保Web服务器的⽤户账号对该⽬录具有写的权限。
2. 添加FileField或者ImageField字段到你的模型中,定义好upload_to参数,⽂件最终会放在MEDIA_ROOT⽬录的“upload_to”⼦⽬录中。
3. 所有真正被保存在数据库中的,只是指向你上传⽂件路径的字符串⽽已。可以通过url属性,在Django的模板中⽅便的访问这些⽂件。
例如,假设你有⼀个ImageField字段,名叫mug_shot,那么在Django模板的HTML⽂件中,可以使⽤{{ object.mug_shot.url }}来获取该⽂件。其中的object⽤你具体的对象名称代替。
4. 可以通过name和size属性,获取⽂件的名称和⼤⼩信息。
安全建议:
⽆论你如何保存上传的⽂件,⼀定要注意他们的内容和格式,避免安全漏洞!务必对所有的上传⽂件
进⾏安全检查,确保它们不出问题!如果你不加任何检查就盲⽬的让任何⼈上传⽂件到你的服务器⽂档根⽬录内,⽐如上传了⼀个CGI或者PHP脚本,很可能就会被访问的⽤户执⾏,这具有致命的危害。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论