Python Django-无法分配,必须是实例
这个问题被提了好几次,尽管我想我是从另一个原因得到的,或者至少我不知道它是如何联系在一起的 Django:1.10.5,Python:3.5.2,Postgres:9.5 因此,我简化了这些模型:Python Django-无法分配,必须是实例,python,django,Python,Django,这个问题被提了好几次,尽管我想我是从另一个原因得到的,或者至少我不知道它是如何联系在一起的 Django:1.10.5,Python:3.5.2,Postgres:9.5 因此,我简化了这些模型: class Parent(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) date_created = models.DateTimeField(aut
class Parent(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
date_created = models.DateTimeField(auto_now=True)
class Child(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
date_created = models.DateTimeField(auto_now=True)
parent = models.ForeignKey(Parent)
def __init__(self, parent, *args, **kwargs):
super(Child, self).__init__(*args, **kwargs)
self.parent = parent
我有一个自定义查询集:
class ChildQuerySet(models.query.QuerySet):
def find_recent(self):
return self.order_by('-date_created')
Child.objects = ChildQuerySet.as_manager()
然后,我尝试为child测试一些自定义queryset方法:
class ChildQuerysetDatabaseIntegrationTest(TestCase): # from django.test
default_parent = Parent()
def setUp(self):
super(ChildQuerysetDatabaseIntegrationTest, self).setUp()
self.default_parent.save()
def test_find_recent(self):
# given
for _ in range(1, 10):
child = Child(self.default_parent)
child.save()
# when
recent = Child.objects.find_recent()
ordered = Child.objects.order_by('-date_created')
# then
self.assertEqual(list(ordered), list(recent))
这会在获取所有实体的测试的最后一行上产生以下错误:
ValueError: Cannot assign "UUID('...')": "Child.parent" must be a "Parent" instance.
通常,当出现一些映射错误时,在实体保存过程中会抛出该错误,但在这里,一切似乎都成功地保持了,但检索失败
试图分配给父实例的UUID对象实际上是子实例的id对象,这让我更加困惑
我尝试将对象创建更改为Parent.objects.create,但结果没有更改。调用任何检索子对象的函数(如ordered.first)也会失败,因此我不知道发生了什么。问题在于您的自定义子对象构造函数。当ORM尝试检索结果时,重写的构造函数会阻止ORM传递列值以正确实例化实例。换句话说,ORM正在尝试按列指定的顺序传递值,例如
Child(id, date_created, parent)
而自定义构造函数希望按以下顺序传递值:
Child(parent, . . .)
要解决此问题,请删除自定义构造函数并使用
instance = Child(parent=parent)
无论何时,只要您想用父项初始化子项。您显然需要为管理器显示代码,如中所示,任何人都可以使用“查找最近的”代码来提供帮助,因为“查找最近的”不是普通的Django