簡體   English   中英

Django:如何使用父模型和子模型強制執行 UniqueConstraint

[英]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)

我想利用ParentModelUniqueConstraint但在ChildModelUniqueConstraint中應用一個附加字段。 我知道這是不可能的,但為了幫助形象化這個想法,我理想地想做這樣的事情:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM