Django模型的繼承

2021-10-23 19:07:19 字數 1604 閱讀 6108

抽象模型繼承(abstract model)

假如我們有如下兩個模型article(文章)和course(課程)模型。它們的模型中有很多共同的字段,比如作者、標題、建立日期和更新日期

這樣寫會造成大量的**重複,乙個更好的方式是提取兩個模型共同的字段建立乙個父類抽象模型(abstract model),再建立子類模型去繼承父類。

class itembase(models.model):

owner = models.foreignkey(user, related_name='%(class)s_related', on_delete=models.cascade)

title = models.charfield(max_length=250)

created = models.datetimefield(auto_now_add=true)

updated = models.datetimefield(auto_now=true)

class meta:

abstract = true

多表模型繼承(multi-table inheritance)

django的多表模型也可用來簡化**,其與抽象模型繼承最大的區別在於django也會為父類模型建立自己的資料表

同時隱式地在父類和子類之間建立乙個一對一關係。比如下例中,我們刪除了父類模型meta選項中的abstract=true,

這樣django就會建立3個資料表。其中共有字段部分會儲存在父類模型對應的資料表裡,每個子類模型專屬的字段會存在每個子類對應的資料表裡

儘管共有欄位是存在父類模型對應的資料表裡,每個子類物件可以像使用自己資料表裡的字段一樣使用那些字段,比如article.title, course.owner

多表繼承中如果乙個父類有多個子類,且子類不在關係中顯式地指定related_name欄位,django會引發驗證錯誤。

這是因為多表繼承的時候,django隱式地在父類和子類之間建立乙個一對一關係,有時候父類與其他類的關係會從父類下移到子類中。

**模型(proxy model)

有時候你需要給子類**模型自定義manager方法,你可以按如下操作。

from django.db import models

class newmanager(models.manager):

...pass

class myperson(person):

objects = newmanager()

class meta:

proxy = true

但上述操作有個問題,其覆蓋了父類的操作方法,比如myperson.objects.all()

如果你希望保留父類自帶方法,同時提供新的manager方法,可以按如下操作。

class extramanagers(models.model):

secondary = newmanager()

class meta:

abstract = true

class myperson(person, extramanagers):

class meta:

proxy = true

Django模型繼承個人運用

django模型繼承個人運用 坑點 不使用抽象模型,資料庫中會產生三張對應表 一對多關係表 那麼如果模型存在繼承的時候,父模型產生表對映,子模型對應的表會通過外來鍵和父表產生關聯從表外來鍵引用主表得主鍵 不能說從表外來鍵引用主表得主鍵就一定是模型繼承 因為一對一 一對多 都會引用主表得主鍵 關係型資...

Django 三種模型繼承

父類繼承來自model.model,但不會在底層資料庫生成相應的資料表,父類的屬性列儲存在其子類的資料表中 作用 多個表若有相同的字段時,可以將這些字段統一定義在抽象類中 要求 class basemodel models.model creat time models.datetimefield ...

Django模板的繼承

模板的繼承 1 什麼是模板的繼承 當多個模板 網頁 具備大部分相同的內容時,就可以使用繼承的方式,將相同的東西繼承過來,再增加 修改屬於自己的內容即可 2 模板繼承的方法 1 在父模板中 必須要標識出來哪些內容是允許被修改的 標籤 父模板中正常顯示的東西 block的作用 定義 在子模板中允許被修改...