您的位置:

django有TypeError("Invalid argument for include_parents: %s" % (include_parents,))报错是怎么回事

  发布时间:2023-04-04 13:56:14
报错的原因这个错误可能是由于在使用Django的ManyToManyField字段时,在使用了参数而导致的。这个参数实际上已经被废弃了,应该改用 "through_fields"来替代。因此, 请修改你的代码并使用 "through_fields" 来解决这个问题。如何解决应该使用 through_fields 来代替 include_parents, 例如需要注意的是,如果你使用了自定义的中间表那么这个表里需要有对应的mymodel和othermodel 字段。还有如果这个错误出现在model中,就需要重新运行makemigrations和migrate来同步更改。这个例子不使用 include_parents, 因此将不会出现的错误。

报错的原因

这个错误可能是由于在使用Django的ManyToManyField字段时,在使用了"include_parents=True"参数而导致的。

这个参数实际上已经被废弃了,应该改用 "through_fields"来替代。

因此, 请修改你的代码并使用 "through_fields" 来解决这个问题。

如何解决

应该使用 through_fields 来代替 include_parents, 例如:


class MyModel(models.Model):
    related_models = models.ManyToManyField(OtherModel, through='IntermediateModel', through_fields=('mymodel','othermodel'))

需要注意的是,如果你使用了自定义的中间表(IntermediateModel), 那么这个表里需要有对应的mymodel和othermodel 字段。

还有如果这个错误出现在model中,就需要重新运行makemigrations和migrate来同步更改。

如果这个错误出现在你使用Django查询时,请检查你的查询代码是否使用了 "include_parents" 参数,并替换成 "through_fields"。

例如,如果你的查询代码是这样的:


MyModel.objects.filter(related_models__in=other_models, include_parents=True)

更改为:


MyModel.objects.filter(related_models__in=other_models).filter(intermediatemodel__othermodel__in=other_models)

这里我假设你的中间表是 IntermediateModel

如果这个错误出现在view中,那就需要检查你的view中的查询代码,并进行修改。

使用例子

下面是一个简单的例子,它展示了如何使用 through_fields 替换 include_parents:


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='AuthorBook', through_fields=('book', 'author'))

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

上面的代码展示了如何使用 through_fields 参数来创建一个中间表(AuthorBook)来关联 Author 和 Book 两个模型。

这个中间表可以存储额外的关于作者和书籍关系的信息,如添加时间。 这个例子不使用 include_parents, 因此将不会出现 "Invalid argument for include_parents" 的错误。

在视图函数中可以这样来使用


def my_view(request):
    books_by_author = Book.objects.filter(authorbook__author__name='John Smith')
    return render(request, 'my_template.html', {'books': books_by_author})

这样的过滤就不会出现上面说的错误。