您的位置:

为什么ValueError("Can't supply a through model and db_constraint=False"),怎么解决

  发布时间:2023-04-03 17:46:34
解决这个问题的方法是,要么去掉db_constraint参数,要么去掉through参数,选择其中之一来使用这个报错就是因为你既定义了 through 又指定了可以去掉或者去掉through 就可以了或者如何解决解决此错误的方法是删除db_constraint参数或者删除through参数中的一个,因为"through"模型本身已经是在数据库中维护关系的模型,因此不能将"db_constraint"参数设置为或者这样就不会报这个错误了。

报错的原因

这个错误通常是因为在使用Django的ORM时,您使用了一个关系模型(例如,ManyToManyField或ForeignKey)并尝试指定一个"through"模型和"db_constraint=False"参数。这是不允许的,因为"through"模型本身就已经是在数据库中维护关系的模型,因此不能将"db_constraint"参数设置为"False"。

解决这个问题的方法是,要么去掉db_constraint参数,要么去掉through参数,选择其中之一来使用。


# Model
class A(models.Model):
    pass

class B(models.Model):
    a = models.ManyToManyField(A,through='C',db_constraint=False)

class C(models.Model):
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)

这个报错就是因为你既定义了 through 又指定了db_constraint = False

可以去掉db_constraint=False, 或者去掉through 就可以了。


class B(models.Model):
    a = models.ManyToManyField(A,through='C')

或者


class B(models.Model):
    a = models.ManyToManyField(A,db_constraint=False)

如何解决

解决此错误的方法是删除db_constraint参数或者删除through参数中的一个,因为"through"模型本身已经是在数据库中维护关系的模型,因此不能将"db_constraint"参数设置为"False"。


# Model
class A(models.Model):
    pass

class B(models.Model):
    a = models.ManyToManyField(A, through='C')

class C(models.Model):
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)

或者


class B(models.Model):
    a = models.ManyToManyField(A, db_constraint=True)

这样就不会报这个错误了。

如果问题依旧存在, 可以检查一下你的models有没有重复定义,重复定义了,就删除重复定义的代码。

使用例子

以下是一个示例,该示例演示了如何在Django模型中定义一个ManyToManyField关系,同时不使用db_constraint参数。


class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author, through='Authorship')

class Authorship(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)

这个例子中没有使用db_constraint参数,而是使用了一个名为Authorship的模型来表示作者与书之间的关系,通过使用关系模型可以在数据库中维护作者与书之间的关系,而不需要使用db_constraint参数。

如果还是不能解决的话,可以检查下你的数据库是否有重复的表,如果有的话,需要删除重复的表。