Django - 模型 2. 字段类型

参考文献:Django 字段 API

字段类型:

AutoField(**options)

根据可用id自动递增的整数字段。通常不需要直接使用它;如果您没有另外指定,主键字段将自动添加到您的模型中。

BigAutoField(**options)

64位整数,非常类似于AutoField,只不过它保证适合1到9223372036854775807之间的数字。

BigIntegerField(**options)

一个64位整数,与IntegerField非常相似,只是它保证适合-9223372036854775808到9223372036854775807之间的数字。这个字段的默认表单小部件是TextInput。

BinaryField(max_length=None, **options):

存储原始二进制数据的字段。可以为它分配字节、字节数组或内存视图。默认情况下,BinaryField将editable设置为False,在这种情况下,它不能包含在模型中。BinaryField有额外的可选参数:max_length。

BooleanField(**options):

该字段的默认表单小部件是CheckboxInput,如果null=True,则为NullBooleanSelect。未定义Field.default时,BooleanField的默认值为None。

CharField(max_length=None, **options)

字符串字段,用于小到大的字符串。对于大量的文本,使用TextField。这个字段的默认表单小部件是TextInput。CharField有一个额外的必需参数:Char_Field.max_length。

DataField(auto_now=False, auto_now_add=False, **options):  

一个日期,在Python中由一个datetime表示。日期的实例。有一些额外的,可选的参数:

DataField.auto_now

每次保存对象时自动将字段设置为now。用于“最后修改”时间戳。注意,总是使用当前日期,它不仅仅是一个可以覆盖的默认值。字段只有在调用Model.save()时才会自动更新。当以其他方式(如QuerySet.update())更新其他字段时,该字段不会被更新,但是您可以在这样的更新中为该字段指定一个自定义值。

DataField.auto_now_add

当对象第一次创建时,自动将字段设置为now。用于创建时间戳。注意,总是使用当前日期;它不仅仅是一个可以覆盖的默认值。所以即使你在创建对象时为这个字段设置了一个值,它也会被忽略。如果您希望能够修改该字段,请将auto_now_add=True设置为:

For DateField: default=date.today - from datetime.date.today()

For DateTimeField: default=timezone.now - from django.utils.timezone.now()

这个字段的默认表单小部件是TextInput。管理员添加了一个JavaScript日历和一个“Today”的快捷方式。包含一个额外的invalid_date错误消息键。

注意:auto_now_add、auto_now和default选项是互斥的。这些选项的任何组合都将导致错误。正如当前实现的那样,将auto_now或auto_now_add设置为True将导致字段的editable=False和blank=True被设置。auto_now和auto_now_add选项将始终在创建或更新时使用默认时区中的日期。如果您需要一些不同的东西,您可以考虑简单地使用您自己的可调用默认值或覆盖save(),而不是使用auto_now或auto_now_add;或者使用DateTimeField而不是DateField,并决定如何在显示时处理从datetime到date的转换。

DateTimeField(auto_now=False, auto_now_add=False, **options)

日期和时间,用Python中的datetime表示。datetime实例。接受与DateField相同的额外参数。这个字段的默认表单小部件是一个TextInput。管理员使用两个带有JavaScript快捷方式的TextInput小部件。

DecimalField(max_digits=None, decimal_places=None, **options):

一个固定精度的十进制数,在Python中由十进制实例表示。它使用DecimalValidator验证输入。有两个必要的参数:

DeciamlField.max_digits

数字中允许的最大位数。注意,这个数字必须大于或等于decimal_places。

DeciamlField.decimal_places

要存储的小数位数。

例如,要存储2位小数的999个数字,您可以使用:

# max_digits = 3+2
models.DecimalField(..., max_digits=5, decimal_places=2)

当localize为False或TextInput为False时,此字段的默认表单小部件是一个数字输入。

DurationField(**options):

用于存储时间段的字段——在Python中按时间增量建模。在PostgreSQL上使用时,使用的数据类型是interval,在Oracle上使用的数据类型是interval DAY(9)到SECOND(6)。否则将使用比金特微秒。

注意:在大多数情况下,使用DurationField进行运算是可行的。但是,在除PostgreSQL之外的所有数据库上,将DurationField的值与DateTimeField实例上的算术值进行比较不会如预期那样工作。

EmailField(max_length=254, **options):

使用EmailValidator检查值是否是有效电子邮件地址的CharField。

FileField(upload_to=None, max_length=100, **options):

文件上传字段。primary_key参数不受支持,如果使用它将引发错误。有两个可选参数:

FileField.upload_to:

此属性提供了一种设置上传目录和文件名的方法,可以通过两种方式进行设置。在这两种情况下,值都传递给Store .save()方法。如果您指定一个字符串值,它可能包含strftime()格式,它将被文件上传的日期/时间所替换(这样上传的文件就不会填满给定的目录)。例如:

class MyModel(models.Model):
    # 文件将上传至 MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # or...
    # 文件将存储至 MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

如果使用默认的FileSystemStorage,字符串值将被追加到MEDIA_ROOT路径,以形成本地文件系统中存储上传文件的位置。如果使用不同的存储,请检查该存储的文档,了解它如何处理upload_to。

upload_to也可以是可调用的,例如函数。这将被调用以获取上传路径,包括文件名。这个可调用函数必须接受两个参数,并返回一个unix风格的路径(带有斜杠),以便传递给存储系统。这两个参数是:

instance:定义FileField的模型实例。更具体地说,这是附加当前文件的特定实例。在大多数情况下,这个对象还没有保存到数据库中,因此如果它使用默认的AutoField,它可能还没有主键字段的值。(没怎么弄懂)

filename:最初给文件的文件名。在确定最终目的地路径时,可能考虑到这一点,也可能不考虑。

例如:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    # 这里没怎么理解instance的含义,希望能有人补充一下,谢谢
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

FileField.storage:

存储对象,它处理文件的存储和检索。有关如何提供此对象的详细信息,请参见管理文件。这个字段的默认表单小部件是ClearableFileInput。

在模型中使用FileField或者ImageField(见下文)有以下几个步骤:

  1. 在设置文件中,需要将MEDIA_ROOT定义为Django存储上传文件的目录的完整路径。(为了提高性能,这些文件没有存储在数据库中)。将MEDIA_URL定义为该目录的基本公共URL。确保此目录可由Web服务器的用户帐户写入。
  2. 将FileField或ImageField添加到您的模型中,定义upload_to选项,以指定MEDIA_ROOT的一个子目录,用于上传文件。
  3. 所有存储在数据库中的都是文件的路径(相对于MEDIA_ROOT)。您很可能希望使用Django提供的便利url属性。例如,如果ImageField名为mug_shot,那么可以在模板{{object.mug_shot.url } }中获取图片的绝对路径。

例如,假设MEDIA_ROOT设置为“/home/media”,upload_to设置为“photos/%Y/%m/%d”。upload_to的“%Y/%m/%d”部分是strftime()格式;“%Y”是四位数的年份,“%m”是两位数的月份,“%d”是两位数的日子。如果您在2007年1月15日上传了一个文件,它将被保存在/home/media/photos/2007/01/15目录中。

如果希望检索上传文件的磁盘文件名或文件大小,可以分别使用名称和大小属性;有关可用属性和方法的更多信息,请参见文件类引用和管理文件主题指南。

注意:该文件是作为将模型保存到数据库中的一部分而保存的,因此在保存模型之前不能依赖磁盘上使用的实际文件名。

可以使用URL属性获得上传文件的相对URL。在内部,它调用底层存储类的url()方法。

请注意,无论何时处理上传的文件,都应该密切注意上传文件的位置和类型,以避免出现安全漏洞。验证所有上传的文件,以确保文件是您认为的那样。例如,如果您盲目地让某人在未经验证的情况下将文件上载到Web服务器文档根目录中,那么某人可以上载CGI或PHP脚本,并通过访问该脚本在站点上的URL来执行该脚本。别让这种事情发生。还要注意,即使是上传的HTML文件,因为它可以由浏览器执行(尽管不是由服务器执行),也会造成相当于XSS或CSRF攻击的安全威胁。

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

FileField 和 FieldFile

当您访问模型上的FileField时,您将获得一个FieldFile实例作为访问底层文件的代理。

FieldFile的API反映了File的API,但有一个关键区别:类包装的对象不一定是Python内置文件对象的包装器。相反,它是store .open()方法结果的包装器,该方法可以是文件对象,也可以是文件API的自定义存储实现。除了从文件继承的API(如read()和write())外,FieldFile还包括几个方法,可用于与底层文件交互:

FieldFile.name: 文件的名称,包括来自相关文件字段的存储根的相对路径。

FieldFile.size: Storage.size()方法的返回结果。

FieldFile.url: 通过调用基础存储类的URL()方法访问文件的相对URL的只读属性。

FieldFile.open(mode='rb'): 以指定模式打开或重新打开与此实例关联的文件。与标准Python open()方法不同,它不返回文件描述符。由于底层文件在访问时是隐式打开的,因此可能没有必要调用此方法,除非重置指向底层文件的指针或更改模式。

FieldFile.close(): 类似于标准Python file.close()方法,并关闭与此实例关联的文件。

FieldFile.save(name,content,save=True): 该方法获取文件名和文件内容,并将其传递给存储类以获取字段,然后将存储的文件与模型字段关联起来。如果您希望手动将文件数据与模型上的FileField实例关联,则使用save()方法来持久存储该文件数据。接受两个必需的参数:name(文件的名称)和content(包含文件内容的对象)。可选的save参数控制与此字段关联的文件更改后是否保存模型实例。默认值为True。注意,content参数应该是django.core.files.File的一个实例,而不是Python的内置文件对象。您可以从现有的Python文件对象构造一个文件,如下所示:

from django.core.files import File
# Open an existing file using Python's built-in open()
f = open('/path/to/hello.world')
myfile = File(f)

或者你可以像这样从Python字符串中构造一个:

from django.core.files.base import ContentFile
myfile = ContentFile("hello world")

有关更多信息,请参见管理文件

FieldFile.delete(save=True): 删除与此实例关联的文件并清除字段中的所有属性。注意:如果在调用delete()时文件恰好是打开的,则此方法将关闭该文件。可选的save参数控制与此字段关联的文件被删除后是否保存模型实例。默认值为True。注意,当删除模型时,相关文件不会被删除。如果您需要清理孤立的文件,您将需要自己处理它(例如,使用可以手动运行的自定义管理命令,或者通过cron定期运行的自定义管理命令)。

注意: 该类的两个方法save()和delete()默认用于将关联的FieldFile的模型对象保存到数据库中。

FilePathField(path=None, match=None, recursive=False, max_length=100, **options):

一种CharField,其选项仅限于文件系统中某个目录中的文件名。有三个特殊参数,其中第一个参数是必需的:

FilePathField.path: 必需。文件系统到一个目录的绝对路径,这个FilePathField应该从这个目录中获得它的选择。例如:“/ home /图片”。

FilePathField.match: 可选。一个正则表达式,作为字符串FilePathField将用于过滤文件名。注意,正则表达式将应用于基本文件名,而不是完整路径。比如:“foo.*\.txt$”。它将匹配一个名为foo23.txt的文件,而不是bar.txt或foo23.png。

FilePathField.recursive: 可选。True/False,默认False。指定是否应包括path的所有子目录。

FilePathField.allow_files: 可选。True/False,默认True。指定是否应包括指定位置的文件。这个或allow_folders必须为真。

FilePathField.allow_folders: 可选。True/False,默认False。指定是否应包括指定位置的文件夹。这个或allow_files必须为真。

当然,这些参数可以一起使用。一个潜在的问题是match应用于基本文件名,而不是完整路径。所以以下例子将匹配/home/images/foo.png,但不匹配/home/images/foo/bar.png,因为该匹配适用于基本文件名(foo.png和bar.png)。:

FilePathField(path="/home/images", match="foo.*", recursive=True)

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

FloatField(**options):

Python中由浮点实例表示的浮点数。当localize为False或TextInput为False时,此字段的默认表单小部件是一个数字输入。

FloatField vs. DecimalField

FloatField类有时与DecimalField类混在一起。虽然它们都表示实数,但它们表示这些数的方式不同。FloatField在内部使用Python的浮点类型,DecimalField使用Python的十进制类型。有关两者之间的区别的信息,请参阅Python的十进制模块文档。

ImageField(upload_to=None,height_field=None,width_field=None,max_length=100,**options)

从FileField继承所有属性和方法,但还验证上传的对象是否是有效的图像。除了FileField可用的特殊属性外,ImageField还具有高度和宽度属性。为了方便查询这些属性,ImageField有两个额外的可选参数:

ImageField.height_field: 该字段将在每次保存模型实例时自动填充图像的高度。

ImageField.width.field: 该字段将在每次保存模型实例时自动填充图像的宽度。

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

IntegerField(**options)

一个整数。从-2147483648到2147483647的值在Django支持的所有数据库中都是安全的。它使用MinValueValidator和MaxValueValidator根据默认数据库支持的值验证输入。当localize为False或TextInput为False时,此字段的默认表单小部件是一个数字输入。

GenericIPAddressField(protocol='both',unpack_ipv4=False,**options)

IPv4或IPv6地址,字符串格式(如192.0.2.30或2a02:42fe::4)。这个字段的默认表单小部件是TextInput。IPv6地址规范化遵循RFC 4291#section-2.2 section 2.2,包括使用该章节第3段中建议的IPv4格式,如::ffff:192.0.2.0。例如,2001:0::0:01将规范化为2001::1,并且::ffff:0a0a:0a0a to::ffff:10.10.10.10。所有字符都转换为小写。

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

GenericIPAddressField.unpack_ipv4: 解压IPv4映射地址,如::ffff:192.0.2.1。如果启用此选项,该地址将解压到192.0.2.1。默认是禁用的。只能在协议设置为“both”时使用。

如果允许空值,则必须允许null,因为空值存储为null。

NullBooleanField(**options)

类似BooleanField中的null=True。使用BooleanField而不是这个字段,因为它在Django的未来版本中可能会被弃用。

PositiveIntegerField(**options)

类似IntegerField,但必须是正数或者0。0到2147483647之间的值在Django支持的所有数据库中都是安全的。出于向后兼容性的原因,可以接受值0。

PositiveSmallIntegerField(**options)

类似PositiveIntegerField,但是只允许在特定(数据库相关)点下的值。0到32767之间的值在Django支持的所有数据库中都是安全的。

SlugField(max_length=50,**options)

Slug是一个报纸术语。slug是某事物的缩写,只包含字母、数字、下划线或连字符。它们通常用于url中。与CharField类似,您可以指定max_length(也可以阅读该部分中关于数据库可移植性和max_length的说明)。如果没有指定max_length, Django将使用默认长度50。意味着将Field.db索引设置为True。根据其他值的值自动预填充slufield通常很有用。您可以在管理员中使用prepopulated_fields自动完成此操作。它使用validate_slug或validate_unicode_slug进行验证。

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

SmallIntegerField(**options)

类似于IntegerField,但只允许在特定(依赖数据库)点下的值。从-32768到32767的值在Django支持的所有数据库中都是安全的。

TextField(**options)

一个大的文本字段。这个字段的默认表单小部件是Textarea。如果指定max_length属性,它将反映在自动生成的表单字段的Textarea小部件中。然而,它没有在模型或数据库级别强制执行。为此使用CharField。

TimeField(auto_now=False,auto_now_add=False,**options)

一个时间,在Python中由一个datetime表示。时间的实例。接受与DateField相同的自动填充选项。这个字段的默认表单小部件是TextInput。管理员添加了一些JavaScript快捷方式。

URLField(max_length=200,*options)

URL的CharField,由URLValidator验证。这个字段的默认表单小部件是TextInput。与所有CharField子类一样,URLField接受可选的max_length参数。如果没有指定max_length,则使用默认值200。

UUIDField(**options)

存储统一唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它存储在uuid数据类型中,否则存储在char(32)中。对于primary_key,通用唯一标识符是AutoField的一个很好的替代方案。数据库不会为您生成UUID,建议使用默认:

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # other fields

注意,一个可调用的(圆括号省略)被传递给default,而不是UUID的实例。

猜你喜欢

转载自blog.csdn.net/obf13/article/details/87252984