一对一关系
通过使用OneToOneField,可以定义模型的一对一关系。它的使用方法和定义其它类型的字段是一样的:把它作为模型的一个属性。
对于一个对象通过某种方式“扩展”了另一个对象的情况,这是极为有用的定义一个对象的方法。
定义一对一字段需要通过一个位置参数:与模型关联的类。
例如,如果你打算创建一个用于描述“地址”的数据库表,你可能让它恰当地包括地址、电话号码等等。然后,如果你打算在“地址”数据库表的基础上创建一个饭店数据库表,你可能会利用饭店与“地址”之间的一对一关系,而不是重复地复制地址表中的内容到饭店表中(因为饭店也是一个地址;事实上,处理这类情况典型的方法是使用继承,也即隐式地包含了一个一对一关系)。
与定义外键一样,定义一个递归关系是允许的,同样允许定义一个到尚未建立的模型的关系;更多细节请查看模型字段参考。
一对一字段也可以接受一个可选参考,更多细节请查看模型字段参考。
过去的版本中,一对一字段会被自动转换成模型的主键。现在不是这样了(尽管你可以通过传递primary_key参数手工设定,如果你想要这样做)。也就是说,现在你可以在一个模型中设置多个一对一类型字段。
跨文件模型
要关系位于另外一个应用中的模型是绝对允许的。要做到这一点,只需在模型类的顶部将要关联的模型导入即可。然后,在需要的地方指向导入的模型类就可以了。例如:
from mysite.geography.models import ZipCode
class Restaurant(models.Model):
zip_code = models.ForeignKey(ZipCode)
字段命名规则
关于Django字段命名,只需注意以下两点:
1.字段名不能使用Python保留字,因为那样做的话将会导致语法。例如:
class Example(models.Model):
pass = models.IntegerField()
2.字段名不能包含相连的多个下划线,这是因为它与Django的查询语法有冲突。例如:
class Example(models.Model):
foo__bar = models.IntegerField()
尽管有了这些限制,Django在字段命名方面仍然运作良好,因为数据库表的列名不一定非得和字段名(译者注:类的域名)保持一致。查看db_column选项了解更多细节。
由于在底层的SQL查询中,Django分离了所有的数据库表名和列名,所以SQL的保留字,像join,where和select等是允许做为字段名的。在实际的数据库引擎中使用的是引用语法。
定制字段类型
如果现有的任何一个字段类型都不能满足你的需要,或者你想要使用某些不太常见的字段类型,你可以创建你自己的字段类型。关于定制自己的字段在创建自定义模型字段一节有完整描述