Django ORM - objects.filter() vs. objects.all().filter() - which one is preferred?

旧城冷巷雨未停 提交于 2019-11-30 07:51:23

The method all() on a manager just delegates to get_queryset(), as you can see in the Django source code:

def all(self):
    return self.get_queryset()

So it's just a way to get the QuerySet from the Manager. This can be handy to ensure that you're dealing with a QuerySet and not a Manager, because MyModel.objects returns a Manager.

For example, if you want to iterate over all the items, you can't do this:

for item in MyModel.objects:
    # do something with item

Because you can't iterate over a Manager. However, all() returns the QuerySet, you can iterate over a QuerySet:

for item in MyModel.objects.all():
    # do something with item

Generally, you should never overwrite all(). You can overwrite get_queryset() but this method must return a QuerySet.

If you would use a filter method like filter() or exclude(), you would already have the QuerySet, because these methods are proxied to the QuerySet. So you don't have to do something like all().filter().

  1. MyModel.objects returns the manager instance. all() return get_query_set(). I think all is there for when you need all objects.
  2. I prefer MyModel.objects.filter() cause the other is just one more method call, and I don't need all objects if I do filter :)
  3. It depends on the purpose. But if they override a base method of the manager, they return the same result format (eg. a QuerySet)
aarif faridi

Mymodel.objects.filter(username='abcd') will give list of match record Mymodel.objects.get(pk='abcd') will return single record with matching on primary key value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!