[英]Django: How to enforce UniqueConstraint with parent and child models
假設我有以下型號:
class ParentModel(models.Model):
parent_field_1 = models.CharField(max_length=10)
parent_field_2 = models.CharField(max_length=10)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['parent_field_1', 'parent_field_2', 'child_field_2'],
name='unique_parent_example'
)
]
class ChildModel(ParentModel):
child_field_1 = models.CharField(max_length=10)
child_field_2 = models.CharField(max_length=10)
我想利用ParentModel
的UniqueConstraint
但在ChildModel
的UniqueConstraint
中應用一個附加字段。 我知道這是不可能的,但為了幫助形象化這個想法,我理想地想做這樣的事情:
class ChildModel(ParentModel):
[.. fields ..]
class Meta:
constraints = [
models.UniqueConstraint(
fields=['parentmodel', 'child_field_2'],
name='unique_child_example'
)
]
幾乎就像我將唯一約束構建為繼承一樣。
我怎么能這樣做?
多表繼承(如您所用)使用一對一的關系。 這意味着每個父母只能有一個孩子,反之亦然
這將隱含地影響孩子的獨特性,因為他們只能與一個父母相關,所以如果父母是唯一的,那么孩子也是如此。
為了防止子模型中的重復信息,只需像在父模型中一樣應用元約束或在字段中執行unique=True
如果您只希望子項中的某些列對父項是唯一的-那么正如您所說-這是不可能的。 為了實現類似的目標,您需要將子模型拆分為多個模型 - 唯一的東西將保留在從父代繼承的子代中,而其他東西將位於與父代有外鍵關系的另一個模型中
這是我根據您分享的內容要做的事情:
class ParentModel(models.Model):
parent_field_1 = models.CharField(max_length=10)
parent_field_2 = models.CharField(max_length=10)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['parent_field_1', 'parent_field_2'],
name='unique_parent'
)
]
class ChildModel(ParentModel):
child_field_2 = models.CharField(max_length=10, unique=true)
# this being unique means that only one parent can have a child like this
class UnInheritedChild(models.Model):
child_field_1 = models.CharField(max_length=10)
parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.