我想使用父類中的欄位作為子類中的約束條件。
模型.py
class ParentClass(object):
...
is_public = models.BooleanField(default=False)
class ChildClass(ParentClass):
...
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
class Meta:
constraints = [
models.CheckConstraint(
check=Q(price__isnull=True) & Q(is_public=True), # <- here
name='price_exists_check',
)
]
當我嘗試遷移時,我在終端中看到此錯誤:
myapp.ChildClass: (models.E016) 'constraints' refers to field 'is_public'
which is not local to model 'ChildClass'.
HINT: This issue may be caused by multi-table inheritance.
很明顯為什么我會看到此錯誤(is_public欄位位于ParentClass)。我的問題是,那是不可能的,還是我可以重構一些東西?
我的最終目標是什么?
為了不讓的情況下ChildClass is_pulic更改True,如果price是null。我想在資料庫級別強制執行此操作。
有沒有辦法,如果有,需要改變什么?
uj5u.com熱心網友回復:
我的問題是,那是不可能的,還是我可以重構一些東西?
我追蹤了原始提交,該提交引入了您所看到的錯誤訊息,以及它正在修復的錯誤。關于模型繼承的檔案也有助于理解這一點。
以下是我對這個問題的理解:
如果您創建一個繼承自另一個模型的 Django 模型,并且該模型不是抽象的,那么 Django 會為父表創建一個外鍵,而不是在子表中重復父模型中的所有欄位。因此,當您創建 ChildClass 物件時,會在 ChildClass 表和ParentClass 表中創建一行。
您不能創建參考多個表的 CHECK 約束。(據我所知。)因此,Django 禁止您創建此約束。
因此,您有以下選擇:
在 ORM 層強制執行。在 clean() 方法中,檢查是否滿足您的約束。(檔案。)如果非 Django 程式修改了資料庫,這不會阻止違反約束。
使父類抽象。你已經說過這是行不通的。
創建第三個類,它們都繼承自. 像這樣創建一個基類:
------------- | BaseClass | ------------- | | V V --------------- -------------- | ParentClass | | ChildClass | --------------- --------------使 BaseClass 抽象,使 ParentClass 和 ChildClass 具體。這允許您使用約束,因為 ChildClass 資料現在只在一個表中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/330720.html
標籤:姜戈 django-models django 约束
