环境
Django 2.2
模型字段参考
本文档包含所有API参考,Field包括Django提供的 字段选项和字段类型。
如果内置字段无法解决问题,则可以尝试django-localflavor(文档),其中包含对特定国家和地区有用的各种代码段。
此外,您可以轻松编写自己的自定义模型字段。
注意
从技术上讲,这些模型是在中定义的django.db.models.fields,但是为了方便起见,将它们导入了django.db.models; 标准导入: from django.db import models, 调用: models.<Foo>Field
字段
以下参数可用于所有字段类型。所有都是可选的。
null
Field.null
如果为True,则Django将NULL在数据库中存储空值。默认值为False。
避免null在基于字符串的字段(例如 CharField和)上使用TextField。如果基于字符串的字段具有 null=True,则意味着它有两个可能的“无数据”值:NULL和空字符串。在大多数情况下,为“无数据”使用两个可能的值是多余的;Django约定是使用空字符串,而不是 NULL。一个例外是当a同时CharField具有unique=True 和blank=Trueset时。在这种情况下,null=True需要使用多个空值保存多个对象时避免违反唯一约束。
对于基于字符串的字段和基于非字符串的字段,blank=True如果您希望在表单中允许使用空值,还需要进行设置,因为该 null参数仅影响数据库存储(请参阅参考资料blank)。
注意
使用Oracle数据库后端时,NULL无论此属性如何,该值都将存储为表示空字符串。
blank
Field.blank
如果为True,则该字段允许为空白。默认值为False。
请注意,这与有所不同null。null与数据库完全相关,而blank与验证相关。如果字段包含blank=True,则表单验证将允许输入一个空值。如果字段包含blank=False,则将需要该字段。
choices
Field.choices
本身由恰好两个项目(例如)的可迭代数组成 的序列,用作此字段的选择。如果给出选择,则它们由模型验证强制执行,并且默认表单小部件将是具有这些选择的选择框,而不是标准文本字段。[(A, B), (A, B) ...]
每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。例如:
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
]
通常,最好在模型类中定义选择,并为每个值定义一个适当命名的常量:
from django.db import models
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
]
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)
def is_upperclass(self):
return self.year_in_school in (self.JUNIOR, self.SENIOR)
尽管您可以在模型类外部定义一个选择列表,然后再引用它,但是在模型类内部定义每个选择的选择和名称,会将所有信息保留在使用它的类中,并使选择易于参考(例如,Student.SOPHOMORE 将Student在导入模型的任何地方工作)。
您还可以将可用的选择收集到命名组中,以用于组织目的:
MEDIA_CHOICES = [
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
]
每个元组中的第一个元素是应用于组的名称。第二个元素是2元组的可迭代对象,每个2元组包含一个值和一个选项的易于理解的名称。可以在单个列表中将分组的选项与未分组的选项组合在一起(例如本示例中的 unknown选项)。
对于已choices设置的每个模型字段,Django将添加一个方法来检索该字段当前值的可读名称。请参阅 get_FOO_display()数据库API文档。
请注意,选择可以是任何序列对象-不一定是列表或元组。这使您可以动态构造选择。但是,如果您发现黑客攻击choices是动态的,那么最好使用带有的适当数据库表ForeignKey。choices表示静态数据,它们不会发生太大变化(如果有的话)。
注意
每次choices更改顺序都会创建一个新的迁移。
除非blank=False在字段上与一起设置, 否则将使用选择框呈现default包含的标签"---------"。要覆盖此行为,添加一个元组choices 包含None; 例如。或者,您可以使用空字符串代替有意义的位置-例如在上。(None, 'Your String For Display')NoneCharField
db_column
Field.db_column
用于该字段的数据库列的名称。如果未指定,Django将使用该字段的名称。
如果您的数据库列名称是SQL保留字,或者包含Python变量名称中不允许使用的字符(尤其是连字符),则可以。Django在幕后引用列名和表名。
db_index
Field.db_index
如果为True,将为此字段创建数据库索引。
db_tablespace
Field.db_tablespace
如果此字段已建立索引,则用于该字段的索引的数据库表空间的名称。默认值是项目的 DEFAULT_INDEX_TABLESPACE设置(如果已设置),或者 db_tablespace是模型的设置(如果有)。如果后端不支持索引的表空间,则忽略此选项。
default
Field.default
字段的默认值。这可以是值或可调用对象。如果可以调用,则每次创建新对象时都会调用它。
默认不能是可变对象(模型实例,list,set等),作为该对象的相同实例的引用将被用作在所有新的模型实例的默认值。而是将所需的默认值包装在可调用中。例如,如果要指定一个默认dict的 JSONField,使用函数:
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
lambda不能用于字段选项,default因为它们不能通过迁移序列化。有关其他注意事项,请参阅该文档。
对于ForeignKey此类映射到模型实例的字段,默认值应为它们引用的字段的值(pk除非 to_field已设置),而不是模型实例。
创建新模型实例且未为该字段提供值时,将使用默认值。如果该字段是主键,则当该字段设置为时也使用默认值None。
editable
Field.editable
如果为False,则该字段将不会显示在管理员或其他任何人中 ModelForm。在模型验证期间也将跳过它们。默认值为True。
error_messages
Field.error_messages
该error_messages参数使您可以覆盖该字段将引发的默认消息。传递一个字典,其中包含与您要覆盖的错误消息相匹配的键。
错误消息键包括null,blank,invalid,invalid_choice, unique,和unique_for_date。在下面的“ 字段类型”部分中为每个字段指定了其他错误消息键。
这些错误消息通常不会传播到表单。请参阅 有关模型的error_messages的注意事项。
help_text
Field.help_text
额外的“帮助”文本将与表单窗口小部件一起显示。即使您的字段未在表单上使用,它对于文档记录也很有用。
请注意,此值未以自动生成的形式转义为HTML。如果需要,可以将HTML包含在内help_text。例如:
help_text="Please use the following format: YYYY-MM-DD."
或者,您可以使用纯文本并 django.utils.html.escape()转义任何HTML特殊字符。确保避免转义来自不受信任用户的任何帮助文本,以避免跨站点脚本攻击。
primary_key
Field.primary_key
如果为True,则此字段是模型的主键。
如果您未primary_key=True在模型中指定任何字段,则Django会自动添加一个AutoField来保留主键,因此primary_key=True除非您要覆盖默认的主键行为,否则无需在任何字段上进行设置。有关更多信息,请参见 自动主键字段。
primary_key=True暗示null=False和 unique=True。一个对象只允许使用一个主键。
主键字段是只读的。如果更改现有对象上的主键的值然后保存,则将在旧对象的旁边创建一个新对象。
unique
Field.unique
如果为True,则该字段在整个表格中必须是唯一的。
这是在数据库级别并通过模型验证强制执行的。如果您尝试在unique 字段中保存具有重复值django.db.IntegrityError的模型,则模型的save()方法将引发 a 。
此选项对ManyToManyField和 以外的所有字段类型均有效OneToOneField。
请注意,当unique为is时True,您无需指定 db_index,因为这unique意味着创建了索引。
unique_for_date
Field.unique_for_date
将此设置为的名称,DateField或DateTimeField要求该字段对于日期字段的值是唯一的。
举例来说,如果你有一个字段title有 unique_for_date="pub_date",那么Django的不允许的两个记录具有相同的入口title和pub_date。
请注意,如果将其设置为指向DateTimeField,则仅考虑字段的日期部分。此外,当USE_TZ是 True时,支票将在执行当前时区的对象被保存的时间。
这是Model.validate_unique()在模型验证期间强制实施的,而不是在数据库级别实施的。如果有任何unique_for_date约束涉及不属于的字段ModelForm(例如,如果其中一个字段已列出exclude或具有 editable=False),Model.validate_unique()则将跳过对该特定约束的验证。
unique_for_month
Field.unique_for_month
类似于unique_for_date,但要求该字段相对于月份是唯一的。
unique_for_year
Field.unique_for_year
喜欢unique_for_date和unique_for_month。
verbose_name
Field.verbose_name
该字段的可读名称。如果未提供详细名称,则Django将使用字段的属性名称自动创建,将下划线转换为空格。请参阅详细字段名称。
validators
Field.validators
要为此字段运行的验证器列表。有关更多信息,请参见验证器文档。
注册并获取查询
Field实现查找注册API。该API可用于自定义哪些查询可用于字段类,以及如何从字段中获取查询。
字段类型
AutoField
classAutoField(** options)[源代码]
会IntegerField根据可用ID自动递增。您通常不需要直接使用它;如果没有另外指定,主键字段将自动添加到模型中。请参阅自动主键字段。
BigAutoField
classBigAutoField(** options)[源代码]
一个64位整数,非常类似于,AutoField不同之处在于它保证可以匹配从1到的数字9223372036854775807。
BigIntegerField
classBigIntegerField(** options)[源代码]
一个64位整数,非常类似于,IntegerField不同之处在于它保证可以匹配从-9223372036854775808到的 数字9223372036854775807。此字段的默认表单窗口小部件是 TextInput。
BinaryField
类BinaryField(max_length = None,** options)[源代码]
一个用于存储原始二进制数据的字段。它可以分配bytes, bytearray或memoryview。
默认情况下,BinaryField设置editable为False,在这种情况下,它不能包含在中ModelForm。
在Django 2.1中进行了更改:
旧版本不允许设置editable为True。
BinaryField 有一个额外的可选参数:
BinaryField.max_length
字段的最大长度(以字符为单位)。最大长度在Django的验证中使用强制执行 MaxLengthValidator。
滥用 BinaryField
尽管您可能考虑过将文件存储在数据库中,但是在99%的情况下,请考虑这样做是不好的设计。该字段不能代替适当的静态文件处理。
BooleanField
classBooleanField(** options)[源代码]
正确/错误字段。
窗口小部件此字段的默认形式CheckboxInput,或者NullBooleanSelect如果null=True。
默认值BooleanField是None当Field.default 没有定义。
在Django 2.1中进行了更改:
在旧版本中,该字段不允许null=True,因此您必须使用NullBooleanField。现在不建议使用后者,因为在未来的Django版本中可能会不建议使用后者。
在较旧的版本中,此字段是blank=True 隐式的。您可以通过设置恢复以前的行为 blank=True。
CharField
类CharField(max_length = None,** options)[源代码]
字符串字段,从小到大的字符串。
对于大量文本,请使用TextField。
此字段的默认表单窗口小部件是TextInput。
CharField 有一个额外的必需参数:
CharField.max_length
字段的最大长度(以字符为单位)。max_length在数据库级别和Django的验证中使用强制执行 MaxLengthValidator。
注意
如果编写的应用程序必须可移植到多个数据库后端,则应注意max_length某些后端存在限制 。有关详细信息,请参考数据库后端说明。
DateField
类DateField(auto_now = False,auto_now_add = False,** options)[源代码]
日期,在Python中由datetime.date实例表示。有一些额外的可选参数:
DateField.auto_now
每次保存对象时自动将字段设置为现在。对于“最后修改的”时间戳有用。请注意,始终 使用当前日期。它不仅是您可以覆盖的默认值。
该字段仅在调用时自动更新Model.save()。以其他方式(例如)对其他字段进行更新时,该字段不会更新QuerySet.update(),尽管您可以像这样在更新中为该字段指定自定义值。
DateField.auto_now_add
首次创建对象时,将字段自动设置为现在。对于创建时间戳很有用。请注意,始终使用当前日期。它不仅是您可以覆盖的默认值。因此,即使您在创建对象时为此字段设置了一个值,也会将其忽略。如果您希望能够修改此字段,请设置以下内容,而不是 auto_now_add=True:
于DateField:default=date.today-从 datetime.date.today()
于DateTimeField:default=timezone.now-从 django.utils.timezone.now()
此字段的默认表单窗口小部件是 TextInput。管理员添加了JavaScript日历和“今天”的快捷方式。包括一个附加的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_nowor auto_now_add;或使用a DateTimeField代替a DateField并确定如何处理显示时间从datetime到date的转换。
DateTimeField
类DateTimeField(auto_now = False,auto_now_add = False,** options)[源代码]
日期和时间,在Python中由datetime.datetime实例表示。接受与相同的额外参数DateField。
该字段的默认表单小部件是单个 TextInput。管理员使用TextInput带有JavaScript快捷方式的两个单独的 小部件。
DecimalField
类DecimalField(max_digits =无,decimal_places =无,**选项)[源]
固定精度的十进制数字,在Python中由 Decimal实例表示。它使用验证输入 DecimalValidator。
有两个必需的参数:
DecimalField.max_digits
数字中允许的最大位数。请注意,此数字必须大于或等于decimal_places。
DecimalField.decimal_places
用数字存储的小数位数。
例如,要存储最大999分辨率为两位小数的数字,可以使用:
models.DecimalField(..., max_digits=5, decimal_places=2)
并以十个小数位的分辨率存储最多约十亿的数字:
models.DecimalField(..., max_digits=19, decimal_places=10)
此字段的默认表单窗口小部件为NumberInput when localizeis False或 TextInput其他方式。
注意
有关FloatField和DecimalField类之间的区别的更多信息 ,请参见FloatField与DecimalField。您还应该知道SQLite 对十进制字段的限制。
DurationField
classDurationField(** options)[源代码]
一个存储时间段的字段-用Python在Python中建模 timedelta。在PostgreSQL上使用时,使用的数据类型为interval,在Oracle上使用为。否则,将使用a 微秒。INTERVAL DAY(9) TO SECOND(6)bigint
注意
DurationField在大多数情况下都可以算术运算。但是,在除PostgreSQL以外的所有数据库上,将a的值与实例DurationField 上的算术进行比较DateTimeField将无法按预期进行。
EmailField
类EmailField(max_length = 254,** options)[源代码]
使用CharField来检查该值是否是有效的电子邮件地址的 EmailValidator。
FileField
类FileField(upload_to = None,max_length = 100,** options)[源代码]
文件上传字段。
注意
primary_key不支持该参数,如果使用该参数将引发错误。
有两个可选参数:
FileField.upload_to
此属性提供了一种设置上传目录和文件名的方法,并且可以通过两种方式进行设置。在两种情况下,该值都将传递给该 Storage.save()方法。
如果您指定一个字符串值,则它可能包含strftime() 格式,该格式将被文件上载的日期/时间替换(以使上载的文件不会填满给定的目录)。例如:
class MyModel(models.Model):
file will be uploaded to MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
or...
file will be saved to 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>
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(请参见下文)需要执行以下步骤:
在您的设置文件中,您需要将其定义MEDIA_ROOT为您希望Django存储上载文件的目录的完整路径。(为了提高性能,这些文件未存储在数据库中。)定义 MEDIA_URL为该目录的基本公共URL。确保该目录可由Web服务器的用户帐户写入。
将FileField或添加ImageField到模型中,定义upload_to用于指定MEDIA_ROOT要用于上载文件的子目录的选项 。
将存储在数据库中的所有文件都是该文件的路径(相对于MEDIA_ROOT)。您很可能想使用urlDjango提供的便捷属性。例如,如果ImageField调用了 your,则mug_shot可以使用来获取模板中图像的绝对路径 。{{ object.mug_shot.url }}
例如,假设您MEDIA_ROOT的设置为'/home/media',并且 upload_to设置为'photos/%Y/%m/%d'。所述'%Y/%m/%d' 的部分upload_to就是strftime()格式化; '%Y'是四位数的年份,'%m'是两位数的月份,'%d'是两位数的日期。如果您在2007年1月15日上传文件,该文件将保存在目录中/home/media/photos/2007/01/15。
如果要检索上载文件的磁盘上文件名或文件大小,可以分别使用name和 size属性。有关可用属性和方法的更多信息,请参见 File类参考和“ 管理文件” 主题指南。
注意
该文件被保存为在数据库中保存模型的一部分,因此,在保存模型之前,不能依赖磁盘上使用的实际文件名。
可以使用url属性获取上载文件的相对URL 。在内部,这将调用url()基础Storage类的方法。
请注意,无论何时处理上传的文件,都应密切注意上传文件的位置以及文件的类型,以避免安全漏洞。验证所有上载的文件,以确保文件符合您的想法。例如,如果您盲目地使某人未经验证就将文件上传到Web服务器文档根目录中的目录,那么某人可以上传CGI或PHP脚本并通过访问其站点上的URL来执行该脚本。不要这样
还要注意,即使上传的HTML文件也可以由浏览器执行(尽管不能由服务器执行),它也会构成等同于XSS或CSRF攻击的安全威胁。
FileField实例在数据库中创建为varchar 列,默认最大长度为100个字符。与其他字段一样,您可以使用max_length参数更改最大长度。
FileField和FieldFile
类FieldFile[源代码]
当您FileField在模型上访问时,系统会为您提供实例,FieldFile以作为代理访问基础文件。
的API FieldFile反映了的API File,但有一个主要区别:类包装的对象不一定是Python内置文件对象的包装。相反,它是Storage.open() 方法结果的包装,它可以是File对象,也可以是FileAPI 的自定义存储的实现。
除了从File诸如 read()和继承的API外write(),FieldFile还包括几种可用于与基础文件进行交互的方法:
警告
此类save()和的 两种方法delete()默认将关联的模型对象保存FieldFile在数据库中。
FieldFile.name
文件名,包括从Storage关联 根目录到根目录的相对路径 FileField。
FieldFile.size
基础Storage.size()方法的结果。
FieldFile.url
一个只读属性,通过调用url()基础Storage类的方法 来访问文件的相对URL 。
FieldFile.open(mode ='rb')[源代码]
在指定的中打开或重新打开与此实例关联的文件 mode。与标准的Python open()方法不同,它不返回文件描述符。
由于访问底层文件时会隐式打开该文件,因此除了重置指向底层文件的指针或更改之外,可能无需调用此方法mode。
FieldFile.close()[来源]
行为类似于标准的Python file.close()方法,并关闭与此实例关联的文件。
FieldFile.save(name,content,save = True)[源代码]
此方法采用文件名和文件内容,并将它们传递到该字段的存储类,然后将存储的文件与model字段关联。如果要手动将文件数据与FileField模型上的实例关联 ,save() 则使用该方法来保留该文件数据。
接受两个必需的参数:name这是文件的名称,和 content是包含文件内容的对象。可选save参数控制在更改与该字段关联的文件之后是否保存模型实例。默认为 True。
请注意,该content参数应该是的实例 django.core.files.File,而不是Python的内置文件对象。您可以File像这样从现有的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定期运行的自定义管理命令)。
FilePathField
类FilePathField(path = None,match = None,递归= False,max_length = 100,** options)[源代码]
A CharField的选择仅限于文件系统上某个目录中的文件名。具有三个特殊参数,其中第一个是 必需的:
FilePathField.path
需要。目录的绝对文件系统路径,从中可以FilePathField选择该目录 。范例:"/home/images"。
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必须是True。
FilePathField.allow_folders
可选的。无论是True或False。默认值为False。指定是否应包含指定位置的文件夹。要么是,要么allow_files必须是True。
当然,这些参数可以一起使用。
一种潜在的陷阱是match适用于基本文件名,而不是完整路径。因此,此示例:
FilePathField(path="/home/images", match="foo.*", recursive=True)
…将匹配,/home/images/foo.png但不匹配,/home/images/foo/bar.png 因为match应用于基本文件名(foo.png和bar.png)。
FilePathField实例在数据库中创建为varchar 列,默认最大长度为100个字符。与其他字段一样,您可以使用max_length参数更改最大长度。
FloatField
classFloatField(** options)[源代码]
在Python中由float实例表示的浮点数。
此字段的默认表单窗口小部件为NumberInput when localizeis False或 TextInput其他方式。
FloatField 与 DecimalField
该FloatField班有时夹杂了 DecimalField阶级。尽管它们均表示实数,但它们以不同的方式表示这些数字。FloatField在float 内部使用Python的类型,而在内部DecimalField使用Python的Decimal类型。有关两者之间区别的信息,请参见该decimal模块的Python文档。
ImageField
类ImageField(upload_to = None,height_field = None,width_field = None,max_length = 100,** options)[源代码]
从继承所有属性和方法FileField,还验证上载的对象是有效的图像。
除了可用于特殊属性FileField,一个ImageField也具有height和width属性。
为了便于查询这些属性,ImageField有两个额外的可选参数:
ImageField.height_field
每次保存模型实例时,模型字段的名称都会自动填充图像的高度。
ImageField.width_field
每次保存模型实例时,模型字段的名称都会自动填充图像的宽度。
需要枕头库。
ImageField实例在数据库中创建为varchar 列,默认最大长度为100个字符。与其他字段一样,您可以使用max_length参数更改最大长度。
此字段的默认表单窗口小部件是 ClearableFileInput。
IntegerField
classIntegerField(** options)[源代码]
一个整数。从-2147483648到的值2147483647在Django支持的所有数据库中都是安全的。
它使用MinValueValidator并 MaxValueValidator根据默认数据库支持的值来验证输入。
此字段的默认表单窗口小部件为NumberInput when localizeis False或 TextInput其他方式。
GenericIPAddressField
类GenericIPAddressField(protocol ='both',unpack_ipv4 = False,** options)[源代码]
字符串格式的IPv4或IPv6地址(例如192.0.2.30或 2a02:42fe::4)。此字段的默认表单窗口小部件是 TextInput。
IPv6地址规范化如下 RFC 4291#section-2.2第 2.2节,包括使用该节第3段建议的IPv4格式 ::ffff:192.0.2.0。例如,2001:0::0:01将被标准化为 2001::1,并::ffff:0a0a:0a0a到::ffff:10.10.10.10。所有字符都将转换为小写。
GenericIPAddressField.protocol
将有效输入限制为指定的协议。可接受的值为'both'(默认值)'IPv4' 或'IPv6'。匹配不区分大小写。
GenericIPAddressField.unpack_ipv4
解压缩IPv4映射的地址,例如::ffff:192.0.2.1。如果启用此选项,则该地址将被解压缩到 192.0.2.1。默认设置为禁用。只能在protocol设置为时使用'both'。
如果允许空白值,则必须允许空值,因为空白值存储为空值。
NullBooleanField
classNullBooleanField(** options)[源代码]
就像BooleanField用null=True。使用该字段代替该字段,因为在将来的Django版本中可能会不推荐使用该字段。
PositiveIntegerField
classPositiveIntegerField(** options)[源代码]
类似于IntegerField,但必须为正数或零(0)。从0到的值2147483647在Django支持的所有数据库中都是安全的。0出于向后兼容的原因,接受该值。
PositiveSmallIntegerField
classPositiveSmallIntegerField(** options)[源代码]
类似于PositiveIntegerField,但仅允许在特定点(与数据库有关)下的值。从0到的值32767在Django支持的所有数据库中都是安全的。
SlugField
类SlugField(max_length = 50,** options)[源代码]
Slug是一个报纸术语。子弹是某事物的简短标签,仅包含字母,数字,下划线或连字符。它们通常在URL中使用。
像CharField一样,您可以指定max_length(也请阅读该max_length部分中有关数据库可移植性的说明)。如果max_length未指定,则Django将使用默认长度50。
表示设置Field.db_index为True。
根据一些其他值自动预填充SlugField通常很有用。您可以使用在管理员中自动执行此操作 prepopulated_fields。
它使用validate_slug或 validate_unicode_slug进行验证。
SlugField.allow_unicode
如果为True,则该字段除了接受ASCII字母外,还接受Unicode字母。默认为False。
SmallIntegerField
classSmallIntegerField(** options)[源代码]
类似于IntegerField,但仅允许在特定点(与数据库有关)下的值。从-32768到的值32767在Django支持的所有数据库中都是安全的。
TextField
classTextField(** options)[源代码]
大文本字段。此字段的默认表单窗口小部件是 Textarea。
如果指定max_length属性,它将反映在Textarea自动生成的表单字段的 小部件中。但是,它不是在模型或数据库级别强制执行的。使用 CharField了点。
TimeField
类TimeField(auto_now = False,auto_now_add = False,** options)[源代码]
时间,在Python中以datetime.time实例表示。接受与相同的自动填充选项DateField。
此字段的默认表单窗口小部件是TextInput。管理员添加了一些JavaScript快捷方式。
URLField
类URLField(max_length = 200,** options)[源代码]
一个CharField一个URL,通过验证 URLValidator。
此字段的默认表单窗口小部件是TextInput。
像所有CharField子类一样,URLField采用可选 max_length参数。如果未指定 max_length,则使用默认值200。
UUIDField
classUUIDField(** options)[源代码]
用于存储通用唯一标识符的字段。使用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)
other fields
请注意,将可调用(省略括号)传递给default,而不是的实例UUID。
在PostgreSQL上查找
使用iexact,contains,icontains, startswith,istartswith,endswith,或 iendswith在PostgreSQL上查找不为值工作不带连字符,因为PostgreSQL将它们存储在一个连字符的UUID数据类型类型。
关系字段
Django还定义了一组表示关系的字段。
ForeignKey
类ForeignKey(to,on_delete,** options)[源代码]
多对一关系。需要两个位置参数:与模型相关的类和on_delete选项。
要创建递归关系(一个与自身具有多对一关系的对象),请使用。models.ForeignKey('self', on_delete=models.CASCADE)
如果需要在尚未定义的模型上创建关系,则可以使用模型的名称,而不是模型对象本身:
from django.db import models
class Car(models.Model):
manufacturer = models.ForeignKey(
'Manufacturer',
on_delete=models.CASCADE,
)
...
class Manufacturer(models.Model):
...
pass
当模型被子类化为具体模型并且与抽象模型的关系不相关时,可以解决在抽象模型上以这种方式定义的关系app_label:
产品/ models.py中
from django.db import models
class AbstractCar(models.Model):
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)
class Meta:
abstract = True
生产/ models.py中
from django.db import models
from products.models import AbstractCar
class Manufacturer(models.Model):
pass
class Car(AbstractCar):
pass
Car.manufacturer will point to production.Manufacturer
here.
要引用在另一个应用程序中定义的模型,可以显式指定带有完整应用程序标签的模型。例如,如果Manufacturer 上面的模型是在另一个名为的应用程序中定义的,则production需要使用:
class Car(models.Model):
manufacturer = models.ForeignKey(
'production.Manufacturer',
on_delete=models.CASCADE,
)
在解决两个应用程序之间的循环导入依赖关系时,这种称为惰性关系的引用可能会很有用。
在上自动创建数据库索引ForeignKey。您可以通过设置db_index为禁用此功能False。如果要创建一致性的外键而不是联接,或者要创建替代索引(例如部分或多列索引),则可能要避免索引的开销。
数据库表示
在后台,Django追加"_id"到字段名称以创建其数据库列名称。在上面的示例中,Car 模型的数据库表将具有一manufacturer_id列。(您可以通过指定显式更改此设置。db_column)但是,除非编写自定义SQL,否则您的代码永远不必处理数据库列名。您将始终处理模型对象的字段名称。
参数
ForeignKey 接受其他定义关系如何工作细节的参数。
ForeignKey.on_delete
当ForeignKey删除由a引用的对象时,Django将模拟on_delete参数指定的SQL约束的行为 。例如,如果您有一个可为空的字段, ForeignKey并且希望在删除引用的对象时将其设置为空:
user = models.ForeignKey(
User,
models.SET_NULL,
blank=True,
null=True,
)
on_delete不会在数据库中创建SQL约束。对数据库级级联选项的支持可能会在以后实现。
的可能值on_delete位于 django.db.models:
CASCADE[来源]
级联删除。Django会在DELETE CASCADE上模拟SQL约束的行为,并删除包含ForeignKey的对象。
Model.delete()不会在相关模型上调用,但是 会为所有已删除对象发送pre_delete和 post_delete信号。
PROTECT[来源]
通过引发ProtectedError的子类来 防止删除引用的对象 django.db.IntegrityError。
SET_NULL[来源]
设置为ForeignKeynull;这是唯一可能 null的True。
SET_DEFAULT[来源]
将ForeignKey其设置为默认值;ForeignKey必须设置默认值 。
SET()[来源]
将设置为ForeignKey传递给的值 SET(),或者如果传递了callable,则调用它的结果。在大多数情况下,有必要传递一个callable,以避免在导入models.py时执行查询:
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),
)
DO_NOTHING[来源]
不采取行动。如果您的数据库后端强制执行参照完整性,则IntegrityError除非您手动将SQL 约束添加到数据库字段,否则这将导致。ON DELETE
ForeignKey.limit_choices_to
使用a ModelForm或admin 呈现此字段时,为该字段的可用选项设置限制(默认情况下,可以选择queryset中的所有对象)。可以使用字典, Q对象或可返回字典或Q对象的可调用对象。
例如:
staff_member = models.ForeignKey(
User,
on_delete=models.CASCADE,
limit_choices_to={'is_staff': True},
)
导致上的相应字段ModelForm仅列出Users 具有的字段is_staff=True。这在Django管理员中可能会有所帮助。
例如,当与Python datetime模块结合使用以限制日期范围内的选择时,可调用形式可能会有所帮助。例如:
def limit_pub_date_choices():
return {'pub_date__lte': datetime.date.utcnow()}
limit_choices_to = limit_pub_date_choices
如果limit_choices_to是或返回,这是很有用复杂的查询,那么将只有当字段中没有列出对管理员可用的选项的效果 在 为模型。Q objectraw_id_fieldsModelAdmin
注意
如果将callable用于limit_choices_to,则每次实例化新表单时都会调用它。当验证模型时也可以调用它,例如通过管理命令或管理员。管理员构造查询集以多次验证其在各种极端情况下的表单输入,因此您的可调用对象有可能被多次调用。
ForeignKey.related_name
用于从相关对象到该对象的关系的名称。它也是related_query_name(用于目标模型的反向过滤器名称的名称)的默认值。有关完整的解释和示例,请参见相关的对象文档。请注意,在抽象模型上定义关系时必须设置此值 ;并且当您这样做时,可以使用 一些特殊的语法。
如果您希望Django不要创建反向关系,请将设置 related_name为'+'或以结束'+'。例如,这将确保该User模型不会与此模型具有向后关系:
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='+',
)
ForeignKey.related_query_name
用于目标模型的反向过滤器名称的名称。它的默认值为related_name或 default_related_name设置的值,否则默认为模型的名称:
Declare the ForeignKey with related_query_name
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags",
related_query_name="tag",
)
name = models.CharField(max_length=255)
That's now the name of the reverse filter
Article.objects.filter(tag__name="important")
喜欢related_name,related_query_name通过一些特殊的语法支持应用程序标签和类插值。
ForeignKey.to_field
关系所涉及的相关对象上的字段。默认情况下,Django使用相关对象的主键。如果您引用其他字段,则该字段必须具有unique=True。
ForeignKey.db_constraint
控制是否应在数据库中为此外键创建约束。默认值为True,几乎可以肯定是您想要的。将此设置False为对数据完整性可能非常不利。也就是说,在某些情况下,您可能需要执行此操作:
您有无效的旧数据。
您正在分片数据库。
如果将此设置为False,则访问不存在的相关对象将引发其DoesNotExist异常。
ForeignKey.swappable
如果它ForeignKey 指向可交换模型,则控制迁移框架的反应。如果它是True-默认值-那么如果ForeignKeys指向与当前值settings.AUTH_USER_MODEL(或另一个可交换模型设置)匹配的模型,则该关系将使用对该设置的引用(而不是直接指向该模型)存储在迁移中。
仅False当您确定模型始终指向交换的模型时(例如,如果它是专门为自定义用户模型设计的配置文件模型),才需要覆盖此设置。
将其设置为False并不意味着即使已交换掉它也可以引用可交换模型- False只是意味着使用此ForeignKey进行的迁移将始终引用您指定的确切模型(因此,如果用户尝试使用可移植模型运行它将很难失败。例如,您不支持的用户模型)。
如有疑问,请将其保留为默认值True。
ManyToManyField
classManyToManyField(to,** options)[源代码]
多对多关系。需要一个位置参数:与模型相关的类,其工作原理与之完全相同 ForeignKey,包括递归和 惰性关系。
可以使用字段的添加,删除或创建相关对象 RelatedManager。
数据库表示
在幕后,Django创建了一个中间联接表来表示多对多关系。默认情况下,使用“多对多”字段的名称和包含它的模型的表的名称来生成此表名。由于某些数据库不支持超过一定长度的表名,因此这些表名将被自动截断并使用唯一性哈希,例如author_books_9cdf。您可以使用该db_table选项手动提供联接表的名称。
参数
ManyToManyField 接受一组额外的参数(所有可选参数),这些参数控制关系的功能。
ManyToManyField.related_name
与相同ForeignKey.related_name。
ManyToManyField.related_query_name
与相同ForeignKey.related_query_name。
ManyToManyField.limit_choices_to
与相同ForeignKey.limit_choices_to。
limit_choices_to当ManyToManyField与通过through参数指定的自定义中间表一起使用时,此命令 无效。
ManyToManyField.symmetrical
仅用于self的ManyToManyFields的定义。考虑以下模型:
from django.db import models
class Person(models.Model):
friends = models.ManyToManyField("self")
Django处理此模型时,会确定其 ManyToManyField本身具有,因此不会person_set向Person该类添加 属性。相反, ManyToManyField假定s是对称的-也就是说,如果我是您的朋友,那么您就是我的朋友。
如果您不想在与的多对多关系中对称self,请将设置 symmetrical为False。这将迫使Django为反向关系添加描述符,从而允许 ManyToManyField关系非对称。
ManyToManyField.through
Django会自动生成一个表来管理多对多关系。但是,如果要手动指定中间表,则可以使用该through选项来指定表示要使用的中间表的Django模型。
此选项最常见的用法是当您要将多余的数据与多对多关联相关联时 。
如果未指定显式through模型,则仍然through可以使用隐式模型类直接访问为保存关联而创建的表。它具有三个用于链接模型的字段。
如果源模型和目标模型不同,那么将生成以下字段:
id:关系的主键。
<containing_model>_id:id声明的模型的 ManyToManyField。
<other_model>_id:指向id的模型的 ManyToManyField。
如果ManyToManyField指向和指向相同模型的点相同,则会生成以下字段:
id:关系的主键。
from_<model>_id:id指向模型的实例(即源实例)的。
to_<model>_id:id关系所指向的实例的实例(即目标模型实例)。
此类可用于查询给定模型实例(如正常模型)的关联记录。
ManyToManyField.through_fields
仅在指定自定义中介模型时使用。Django通常会确定要使用中介模型的哪些字段,以便自动建立多对多关系。但是,请考虑以下模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=50)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(
Person,
through='Membership',
through_fields=('group', 'person'),
)
class Membership(models.Model):
group = models.ForeignKey(Group, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
inviter = models.ForeignKey(
Person,
on_delete=models.CASCADE,
related_name="membership_invites",
)
invite_reason = models.CharField(max_length=64)
Membership(和 )有两个外键,这使关系变得模棱两可,并且Django无法知道要使用哪个。在这种情况下,您必须使用明确指定Django应该使用的外键,如上例所示。Personpersoninviterthrough_fields
through_fields接受一个2元组,其中 是定义在其上的模型的外键的名称 (在这种情况下),以及 目标模型的外键的名称( 在这种情况下)。('field1', 'field2')field1ManyToManyFieldgroupfield2person
当您在参与多对多关系的任何(或什至两个)模型的中介模型上具有多个外键时,必须指定through_fields。 当使用中间模型并且该模型有两个以上的外键时,或者您要明确指定应使用两个Django时,这也适用于 递归关系。
使用中间模型的递归关系始终被定义为非对称的-也就是说,symmetrical=False 因此-具有“源”和“目标”的概念。在这种情况下,'field1'将被视为关系的“源”和 'field2'“目标”。
ManyToManyField.db_table
为存储多对多数据而创建的表的名称。如果未提供,则Django将基于以下名称采用默认名称:定义关系的模型表和字段本身的名称。
ManyToManyField.db_constraint
控制是否应在数据库中为中间表中的外键创建约束。默认值为True,几乎可以肯定是您想要的。将此设置False为对数据完整性可能非常不利。也就是说,在某些情况下,您可能需要执行此操作:
您有无效的旧数据。
您正在分片数据库。
同时传递db_constraint和和是错误的through。
ManyToManyField.swappable
如果它ManyToManyField 指向可交换模型,则控制迁移框架的反应。如果它是True-默认值-那么如果ManyToManyFields指向与当前值settings.AUTH_USER_MODEL(或另一个可交换模型设置)匹配的模型,则该关系将使用对该设置的引用(而不是直接指向该模型)存储在迁移中。
仅False当您确定模型始终指向交换的模型时(例如,如果它是专门为自定义用户模型设计的配置文件模型),才需要覆盖此设置。
如有疑问,请将其保留为默认值True。
ManyToManyField不支持validators。
null 没有作用,因为没有办法在数据库级别上要求关联。
OneToOneField
类OneToOneField(to,on_delete,parent_link = False,** options)[源代码]
一对一的关系。从概念上讲,这与ForeignKeywith 相似 unique=True,但是关系的“反向”侧将直接返回单个对象。
这作为以某种方式“扩展”另一个模型的模型的主键最为有用。例如,通过从子模型到父模型添加隐式的一对一关系来实现多表继承。
需要一个位置参数:与模型相关的类。它的工作原理与之完全相同ForeignKey,包括有关递归 和惰性关系的所有选项。
如果您未指定的related_name参数,则 OneToOneFieldDjango会将当前模型的小写名称用作默认值。
用下面的例子:
from django.conf import settings
from django.db import models
class MySpecialUser(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
supervisor = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='supervisor_of',
)
您产生的User模型将具有以下属性:
user = User.objects.get(pk=1)
hasattr(user, 'myspecialuser')
True
hasattr(user, 'supervisor_of')
True
一个DoesNotExist访问反向关系时,如果在相关表中的条目不存在异常。例如,如果用户没有由指定的主管MySpecialUser:user.supervisor_of
Traceback (most recent call last):
...
DoesNotExist: User matching query does not exist.
此外,OneToOneField接受接受的所有其他参数ForeignKey,再加上一个参数:
OneToOneField.parent_link
当True在从另一个具体模型继承的 模型中使用时,指示该字段应该用作返回到父类的链接,而不是OneToOneField通常由子类隐式创建的额外字段 。
有关的用法示例,请参见一对一关系OneToOneField。
现场API参考
类Field[源代码]
Field是代表数据库表列的抽象类。Django使用字段创建数据库表(db_type()),将Python类型映射到数据库(get_prep_value()),反之亦然(from_db_value())。
因此,字段是不同Django API(尤其是models和)中的基础部分 querysets。
在模型中,字段被实例化为类属性,并代表特定的表列,请参见Models。它具有诸如null和的属性unique,以及Django用于将字段值映射到特定于数据库的值的方法。
阿Field是的一个子类 RegisterLookupMixin,因此两者 Transform并 Lookup可以登记在其上中使用QuerySetS(例如field_name__exact="foo")。默认情况下,所有内置查询都已注册。
的所有Django内置字段CharField都是的特定实现Field。如果需要自定义字段,则可以子类化任何内置字段,也可以Field从头开始编写。在任何一种情况下,请参见编写自定义模型字段。
description
字段的详细描述,例如针对 django.contrib.admindocs应用程序。
描述可以采用以下形式:
description = _("String (up to %(max_length)s)")
从字段的内插参数__dict__。
要将映射Field到特定于数据库的类型,Django公开了几种方法:
get_internal_type()[来源]
返回一个命名此字段的字符串,以用于后端特定目的。默认情况下,它返回类名称。
请参阅模拟内置字段类型以在自定义字段中使用。
db_type(连接)[源代码]
Field考虑到,返回的数据库列数据类型connection。
有关在自定义字段中的用法,请参阅自定义数据库类型。
rel_db_type(连接)[源代码]
考虑到,返回诸如ForeignKey 和OneToOneField指向的字段的数据库列数据类型。Fieldconnection
有关在自定义字段中的用法,请参阅自定义数据库类型。
Django需要在三种主要情况下与数据库后端和字段进行交互:
查询数据库时(Python值->数据库后端值)
从数据库加载数据时(数据库后端值-> Python值)
当它保存到数据库时(Python值->数据库后端值)
查询时,get_db_prep_value()并get_prep_value()使用:
get_prep_value(值)[来源]
value 是模型属性的当前值,该方法应以已准备好用作查询中的参数的格式返回数据。
请参阅将Python对象转换为查询值以供使用。
get_db_prep_value(value,connection,prepare = False)[源代码]
转换value为特定于后端的值。默认情况下,它返回 valueif prepared=True和get_prep_value()if是 False。
请参阅将查询值转换为数据库值以供使用。
加载数据时,from_db_value()使用:
from_db_value(值,表达式,连接)
将数据库返回的值转换为Python对象。是的反面get_prep_value()。
此方法不适用于大多数内置字段,因为数据库后端已经返回了正确的Python类型,或者后端本身进行了转换。
请参见将值转换为Python对象以供使用。
注意
出于性能方面的考虑,from_db_value并未在不需要它的字段(所有Django字段)上实现为无操作。因此,您可能不会调用super您的定义。
保存时,pre_save()和get_db_prep_save()使用:
get_db_prep_save(value,connection)[源代码]
与相同get_db_prep_value(),但在必须将字段值保存到数据库时调用。默认情况下返回 get_db_prep_value()。
pre_save(model_instance,add)[源代码]
get_db_prep_save()在保存之前准备值之前调用的方法(例如用于DateField.auto_now)。
model_instance是该字段所属的实例,并且add 是实例是否是第一次保存到数据库中。
它应该model_instance为此字段返回适当属性的值 。属性名称位于 self.attname(由设置Field)。
请参阅在保存使用前对值进行预处理。
字段通常从序列化或表单中以不同的类型接收其值。
to_python(值)[来源]
将值转换为正确的Python对象。它充当的反向value_to_string(),也称为 clean()。
请参见将值转换为Python对象以供使用。
除了保存到数据库之外,该字段还需要知道如何序列化其值:
value_from_object(obj)[源代码]
返回给定模型实例的字段值。
经常使用此方法value_to_string()。
value_to_string(obj)[源代码]
转换obj为字符串。用于序列化字段的值。
有关用法,请参阅转换字段数据以进行序列化。
使用时, 需要知道它应该由以下哪个字段表示:model formsField
formfield(form_class = None,choices_form_class = None,** kwargs)[源代码]
返回django.forms.Field此字段 的默认值ModelForm。
默认情况下,如果form_class和choices_form_class均为 None,则使用CharField。如果该字段已 指定,choices并且choices_form_class未指定,则使用TypedChoiceField。
请参阅为模型字段指定表单字段以供使用。
deconstruct()[来源]
返回一个包含足够信息以重新创建该字段的4元组:
模型上字段的名称。
字段的导入路径(例如"django.db.models.IntegerField")。这应该是最可移植的版本,因此不太具体可能会更好。
位置参数列表。
关键字参数的字典。
必须将此方法添加到1.7之前的字段中,才能使用Migrations迁移其数据。
字段属性参考
每个Field实例都包含几个允许自省其行为的属性。isinstance 当您需要编写依赖于字段功能的代码时,请使用这些属性而不是检查。这些属性可以与Model._meta API一起使用,以缩小对特定字段类型的搜索范围。自定义模型字段应实现这些标志。
字段的属性
Field.auto_created
布尔值标志,指示是否自动创建该字段,例如OneToOneField模型继承所使用的字段。
Field.concrete
布尔值标志,指示该字段是否具有与其关联的数据库列。
Field.hidden
布尔值标志,指示是否使用一个字段来支持另一个非隐藏字段的功能(例如,组成一个的content_type和object_id字段GenericForeignKey)。该hidden标志用于从模型上的所有字段中区分构成模型上字段的公共子集的内容。
注意
Options.get_fields() 默认情况下排除隐藏字段。传递include_hidden=True以返回结果中的隐藏字段。
Field.is_relation
布尔标志,表明如果一个字段包含一个或多个其他模型的功能(例如引用ForeignKey, ManyToManyField,OneToOneField,等)。
Field.model
返回定义字段的模型。如果在模型的超类上定义了字段,model则将引用该超类,而不是实例的类。
具有关系的字段的属性
这些属性用于查询关系的基数和其他详细信息。这些属性出现在所有字段中。但是,None如果字段是关系类型(Field.is_relation=True),则它们将仅具有布尔值(而不是)。
Field.many_to_many
布尔标志,表示True该字段是否具有多对多关系; False除此以外。Django随附的唯一字段 True是ManyToManyField。
Field.many_to_one
布尔标志,即True字段是否具有多对一关系,例如ForeignKey;;False除此以外。
Field.one_to_many
布尔值标志,表示True字段是否具有一对多关系,例如a GenericRelation或a 的倒数ForeignKey;False 除此以外。
Field.one_to_one
布尔标志,表示True字段是否具有一对一关系,例如OneToOneField;;False除此以外。
Field.related_model
指向该领域所涉及的模型。例如,Author在中 。在一个始终。ForeignKey(Author, on_delete=models.CASCADE)related_modelGenericForeignKeyNone