Django TabularInline中的FOREIGN KEY约束失败

时间:2018-09-27 17:16:55

标签: django

我有2个模型:Responsavel和Filho。 Responsavel可能有很多Filhos,因此在我的admin.py文件中,我有以下内容:

class FilhoInline(admin.TabularInline):
    model = Filho

@admin.register(Responsavel)
class ResponsavelAdmin(admin.ModelAdmin):
    inlines = [
        FilhoInline
    ]

    def save_model(self, request, obj, form, change):
        obj.user.is_pai = True
        obj.user.save()
        super().save_model(request, obj, form, change)

有了这个,我可以在同一屏幕上插入Responsavel和Filho,更加有用。因此,在我的models.py中,我有:

class Responsavel(models.Model):
    user = models.OneToOneField(TogetherUser, verbose_name="Usuário", primary_key=True, on_delete=models.CASCADE)
    cpf = models.CharField(max_length=11, unique=True)
    telefone1 = models.CharField(max_length=50, blank=True, null=True)
    telefone2 = models.CharField(max_length=50, blank=True, null=True)
    telefone3 = models.CharField(max_length=50, blank=True, null=True)

    def __str__(self):
        return self.user.username

    class Meta:
        verbose_name_plural = "Responsáveis"
        verbose_name = "Responsável"

class Filho(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    nome = models.CharField(max_length=100)
    data_nascimento = models.DateField(verbose_name="Data de Nascimento")
    genero = models.CharField(max_length=1, choices=Genero.choices(), verbose_name="Gênero")
    responsavel = models.ForeignKey(Responsavel, on_delete=models.PROTECT, verbose_name="Responsável")

    def __str__(self):
        return self.nome

    class Meta:
        verbose_name_plural = "Filhos"

当我尝试在Admin Django中保存Responsavel和您的“ Filhos”时,出现以下错误:

IntegrityError at /admin/core/responsavel/add/
FOREIGN KEY constraint failed

但是,如果我添加没有任何“ Filhos”的Responsavel,一切正常。

修改1: 我将models.PROTECT更改为models.CASCADE,它可以正常工作,

responsavel = models.ForeignKey(Responsavel, on_delete=models.PROTECT, verbose_name="Responsável")

responsavel = models.ForeignKey(Responsavel, on_delete=models.CASCADE, verbose_name="Responsável")

我不知道为什么如果这是“ on_delete”而不是“ on_update”或其他东西,为什么这会影响我的保存方法。

0 个答案:

没有答案