Django 4,ValueError:“MyModel”实例需要有主键值才能使用此关系

问题描述 投票:0回答:1

该问题是由于 django 4 更新造成的,在之前的版本中不存在该问题。当对外键关系执行反向查找时,如果用于反向查找的对象尚未保存到数据库(该对象没有 pk),则会引发异常,ValueError: 'MyModel' 实例需要有一个可以使用此关系之前的主键值。例如:

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

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publication_date = models.DateField()

new_author = Author(name='John Doe', biography='A new author')
reverse_look_up = new_author.book_set.all()  # this raises the issue.

在 django 3.2 及更低版本中,执行此操作不会引发错误,而是返回一个空的 book 查询集。您可以手动解决此问题,方法是检查对象是否有 id,然后仅在有 id 时才执行查找,或者预先保存对象,但是我在很多地方执行这种查找,这会很困难这样做。无论如何,是否可以对此执行通用修复,无论是我可以对模型管理器、猴子修补还是一般项目进行更改。

django django-models django-managers
1个回答
0
投票

如果您有两个类,例如 X 和 Y,并且 X 是 Y 类中的外键引用。

x = X()
y = Y(x=x, b=b)
x.save()
y.save()

以上在 django 3.2 上可以完美运行。但相同的代码将在 django 4.2 上通过

ValueError: 'X' instance needs to have a primary key value before this relationship can be used

要修复它,您需要先保存X。

x = X()
x.save()
y = Y(x=x, b=b)
y.save()

这解决了我的问题

© www.soinside.com 2019 - 2024. All rights reserved.