您的位置:

关于django的ValueError("Cannot specify through_fields without a through model")

  发布时间:2023-04-03 22:09:00
报错的原因这个错误是由于在使用Django中的多对多关系时,没有指定中间模型导致的。使用例子是的,下面是一个例子这里的through参数被设置为None, 这样Django就会使用默认的中间模型来维护多对多关系。

报错的原因

这个错误是由于在使用Django中的多对多关系时,没有指定中间模型(through model)导致的。Django默认在多对多关系中使用中间模型来维护关系。如果要自定义中间模型或者直接使用默认的中间模型可以通过使用 through='name_of_model' 来指定。

如何解决

你可以在你的关系中指定中间模型来解决这个问题。比如下面的代码,其中through参数指定了中间模型:


class Person(models.Model):
    name = models.CharField(max_length=128)

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

另外你也可以在你的ManyToManyField中设置related_name='+', 这样django就不会使用中间表。


class Person(models.Model):
    name = models.CharField(max_length=128)
    groups = models.ManyToManyField(Group, related_name='+')

如果你不想使用中间模型,可以使用ManyToManyField(through=None)来使用默认中间模型。

使用例子

是的,下面是一个例子:


class Person(models.Model):
    name = models.CharField(max_length=128)
    groups = models.ManyToManyField(Group, related_name='+', through=None)

这里的through参数被设置为None, 这样Django就会使用默认的中间模型来维护多对多关系。

或者你也可以通过在many to many字段中使用 related_query_name='+'来不使用中间模型,


class Person(models.Model):
    name = models.CharField(max_length=128)
    groups = models.ManyToManyField(Group, related_query_name='+')

这样就可以避免ValueError("Cannot specify through_fields without a through model")了。