繁体   English   中英

Django objects.filter vs objects.all

[英]Django objects.filter vs objects.all

我对 django 对象的 filter() 和 all() 方法有疑问。 这不是两个更喜欢哪一个的问题,我只是注意到一个奇怪的(对我来说)行为。 因为,正如它在

Django ORM - objects.filter() 与 objects.all().filter() - 哪个更受欢迎?

在 Django src 中,两种方式都应该返回相同的(它们都引用了 chain() 方法):

看:

https://github.com/django/django/blob/0963f184abd96800b76b19a6a181e1b544c7fafe/django/db/models/query.py#L928

和:

https://github.com/django/django/blob/0963f184abd96800b76b19a6a181e1b544c7fafe/django/db/models/query.py#L951

所以 filter() 和 all() 方法应该返回相同的对象。 但我最近发现了以下行为:

MyModel.objects.all()[0].update(name="Test")

# --> $: AttributeError: type object 'MyModel' has no attribute 'update'

# And to check if it indeed has no update method:

MyModel.objects.all[0].__dir__() # --> no update() method in returned dictionary but a save method

因此,虽然上面的代码引发了错误,但下面的行会起作用:

MyModel.objects.all()[0].name = "Test"
MyModel.objects.all()[0].save()

但是,如果通过 filter() 方法检索到相同的 object,则它具有 update() 方法。

为什么我两次都得到相同的 object 但添加了看似不同的方法?

update() function 仅在管理器 object 上。 查看您的评论,您实际上被称为MyModel.objects.filter(name="Test").update(name="test2")这是一个有效的查询集 function。 如果您使用MyModel.objects.get(name="Test")这将与all()版本相同。

在您的all()示例中,您正在处理 model,它缺少update() function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM