OneToOneField
用来定义一对一关系。 和使用其它Field
类型一样:在模型当中把它做为一个类属性包含进来。
当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系。
OneToOneField
要一个位置参数:与模型关联的类。
例如,如果你正在建立一个“places”的数据库,那么你将建立一个非常标准的地址、电话号码等 在数据库中。 接下来,如果你想在place数据库的基础上建立一个restaurant数据库,而不想将已有的字段复制到Restaurant
模型,那你可以在 Restaurant
添加一个OneToOneField
字段,这个字段指向Place
(因为Restaurant 本身就是一个Place;事实上,在处理这个问题的时候,你应该使用一个典型的 inheritance,它隐含一个一对一关系)。
与ForeignKey
一样,可以定义递归关系,并可以引用尚未定义的模型。
提示:
在一对一关联关系模型示例中有一套完整的例子。
OneToOneField
字段也接受一个可选的parent_link
参数。
在以前的版本中,OneToOneField
字段会自动变成模型 的主键。 不过现在已经不这么做了(不过要是你愿意的话,你仍可以传递 primary_key
参数来创建主键字段)。 所以一个 模型 中可以有多个OneToOneField
字段。
跨文件的模型¶
访问其他应用的模型是非常容易的。 在文件顶部你定义模型的地方,导入相关的模型来实现它。 然后,无论在哪里需要的话,都可以引用它。 例如: from django.db import models from geography.models import ZipCode class Restaurant(models.Model): # ... zip_code = models.ForeignKey( ZipCode, on_delete=models.SET_NULL, blank=True, null=True, )
字段名称限制¶
Django 对字段的命名只有两个限制:
-
字段的名称不能是Python 保留的关键字,因为这将导致一个Python 语法错误。 例如:
class Example(models.Model): pass = models.IntegerField() # 'pass' is a reserved word!
-
由于Django 查询语法的工作方式,字段名称中连续的下划线不能超过一个。 例如:
class Example(models.Model): foo__bar = models.IntegerField() # 'foo__bar' has two underscores!
这些限制有变通的方法,因为没有要求字段名称必须与数据库的列名匹配。 参见db_column
选项。
SQL 的保留字例如select
、where
和join
,可以用作模型的字段名,因为Django 会对底层的SQL 查询语句中的数据库表名和列名进行转义。 它根据你的数据库引擎使用不同的引用语法。