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 查詢語句中的數據庫表名和列名進行轉義。 它根據你的數據庫引擎使用不同的引用語法。
