django_models_一对一关系

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 对字段的命名只有两个限制:

  1. 字段的名称不能是Python 保留的关键字,因为这将导致一个Python 语法错误。 例如:

    class Example(models.Model):
        pass = models.IntegerField() # 'pass' is a reserved word!
    
  2. 由于Django 查询语法的工作方式,字段名称中连续的下划线不能超过一个。 例如:

    class Example(models.Model):
        foo__bar = models.IntegerField() # 'foo__bar' has two underscores!
    

这些限制有变通的方法,因为没有要求字段名称必须与数据库的列名匹配。 参见db_column选项。

SQL 的保留字例如selectwhere 和join,可以用作模型的字段名,因为Django 会对底层的SQL 查询语句中的数据库表名和列名进行转义。 它根据你的数据库引擎使用不同的引用语法。

 

上一篇:python class的使用


下一篇:女程序员被瞧不起?92年程序媛发帖晒薪资,网友:老妹你可以了