Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-无法分配,必须是实例_Python_Django - Fatal编程技术网

Python Django-无法分配,必须是实例

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

这个问题被提了好几次,尽管我想我是从另一个原因得到的,或者至少我不知道它是如何联系在一起的

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(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