Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 querysey索引运算符返回对象的副本_Python_Django_Django Queryset - Fatal编程技术网

Python 为什么django querysey索引运算符返回对象的副本

Python 为什么django querysey索引运算符返回对象的副本,python,django,django-queryset,Python,Django,Django Queryset,我知道django querysey是一个生成器,而不是一个列表 my_items = Item.objects.filter(id = 1) my_items[0].name = 'joe' my_items[0].save() 在本例中,my_items[0]是对象的副本,因此保存不会修改对象。 而这将起作用(不会创建副本) 在django文档(或任何其他地方)中,它在哪里解释了这种行为? 为什么他们选择返回对象的副本而不是对象本身?您在第二行中写了“我的时间”这一事实重要吗 Item.o

我知道django querysey是一个生成器,而不是一个列表

my_items = Item.objects.filter(id = 1)
my_items[0].name = 'joe'
my_items[0].save()
在本例中,my_items[0]是对象的副本,因此保存不会修改对象。
而这将起作用(不会创建副本)

在django文档(或任何其他地方)中,它在哪里解释了这种行为?
为什么他们选择返回对象的副本而不是对象本身?

您在第二行中写了“我的时间”这一事实重要吗

Item.objects.filter(pk = 1).update(name = 'Joe')

以及您要求的文档:


每次优化QuerySet时,都会得到一个全新的QuerySet,它与以前的QuerySet没有任何关联。每一次改进都会创建一个单独的、不同的查询集,可以存储、使用和重用。

您在第二行中写下“我的时间”这一事实重要吗

Item.objects.filter(pk = 1).update(name = 'Joe')

以及您要求的文档:

每次优化QuerySet时,都会得到一个全新的QuerySet,它与以前的QuerySet没有任何关联。每个细化都会创建一个单独的、不同的查询集,可以存储、使用和重用。

中对其进行了说明。它不仅仅是现有对象的副本。每次执行此操作时,Django都会对数据库进行单独的查询,并根据响应创建一个新对象。以下是文档提供的示例:

>>> queryset = Entry.objects.all()
>>> print queryset[5] # Queries the database
>>> print queryset[5] # Queries the database again
但是,如果已经计算了queryset,则使用索引运算符获取对象不会命中数据库,并且每次都会得到相同的对象(如文档中所示)

更新:我被要求进一步澄清,所以它是这样的:

你认为你得到的是一个对象的副本,但严格来说这不是真的。您将获得两个不同的Python对象,它们是独立创建的,但基于相同的数据库条目。这是因为每次使用索引操作符时,都会查询数据库并创建一个新对象(前提是之前没有对查询进行计算)

在您的例子中,您使用操作符两次,两次都命中数据库。第一次在第二行:
my_items[0]。name='joe'
;第二次在第三行:
my\u items[0]。save()
。每次执行
my\u items[0]
操作时,您都在使用操作符,查询数据库并创建新对象。因此,保存的对象与修改的对象不同

它记录在中。它不仅仅是现有对象的副本。每次执行此操作时,Django都会对数据库进行单独的查询,并根据响应创建一个新对象。以下是文档提供的示例:

>>> queryset = Entry.objects.all()
>>> print queryset[5] # Queries the database
>>> print queryset[5] # Queries the database again
但是,如果已经计算了queryset,则使用索引运算符获取对象不会命中数据库,并且每次都会得到相同的对象(如文档中所示)

更新:我被要求进一步澄清,所以它是这样的:

你认为你得到的是一个对象的副本,但严格来说这不是真的。您将获得两个不同的Python对象,它们是独立创建的,但基于相同的数据库条目。这是因为每次使用索引操作符时,都会查询数据库并创建一个新对象(前提是之前没有对查询进行计算)


在您的例子中,您使用操作符两次,两次都命中数据库。第一次在第二行:
my_items[0]。name='joe'
;第二次在第三行:
my\u items[0]。save()
。每次执行
my\u items[0]
操作时,您都在使用操作符,查询数据库并创建新对象。因此,保存的对象与修改的对象不同

谢谢你的回答,但我知道怎么做。这不是我的问题。我为你的问题添加了文档。但是,即使我在最后得到一个对象并对其进行更改和保存时细化了许多查询集,它也会修改原始对象。谢谢你的回答,但我知道如何使它工作。这不是我的问题。我为你的问题添加了文档。但是,即使我在最后得到一个对象并对其进行更改和保存时细化了许多查询集,它也会修改原始对象。但你所描述的不是我的问题-查询集尚未计算。我的问题是获取对象和对象本身的副本。我不知道明白这不是你的问题。您没有得到相同的对象,因为之前没有计算queryset,所以每次使用index操作符时,都会查询数据库并创建一个新对象。你认为你得到的是一个对象的副本,但严格来说这不是真的。您将获得两个不同的Python对象,它们是独立创建的,但基于相同的数据库条目。我的问题是,为什么经过评估后,我得到的是副本而不是原件。看看我添加到问题中的代码。如果像你说的那样,我认为我只得到了对象的一个副本,那么为什么save方法不将其保存到对象中?那不是真的。您两次使用操作符,两次都命中数据库。第一次在第二行:
my_items[0]。name='joe'
;第二次在第三行:
my\u items[0]。save()
。每次执行
my\u items[0]
操作时,您都在使用操作符,查询数据库并创建新对象。因此,您保存的对象与您修改的对象不同。哦!我明白了:)。你是对的!你能把它放在你的答案中吗?但是你描述的不是我的问题-查询集还没有被评估。我的问题是获取对象和对象本身的副本。我不明白这怎么不是你的问题。您没有得到相同的对象,因为之前没有计算queryset,所以每次使用index操作符时,都会查询数据库并创建一个新对象。你以为你得到了一份