Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Model vs. Manager

Not really sure what the difference is. Seems like all the Manager does is have a bunch of functions related to the Model. But these functions could also be placed in the Model too....

Django documentation describes the Manager as follows,

A Manager is the interface through which database query operations are provided to Django models.

So is there anything else fundamentally different about the Manager than this simple abstraction?

Or a better question: what methods should be defined in the Model vs. the Manager? Is there an ACTUAL difference or just stylistic one?

like image 498
reedvoid Avatar asked Jun 26 '13 12:06

reedvoid


People also ask

Should I use Django models?

When do you use a Django model? Use Django models when you need to dynamically load information in your project. For example, if you create a blog don't hard code every piece of article content. Create an article model with the article title, URL slug, and content as the model fields.

What does models manager class do in Django?

A Manager is a Django class that provides the interface between database query operations and a Django model. In other words, in a Django model, the manager is the interface that interacts with the database.

What is a model manager?

A model manager's focus is on managing models career than with arranging auditions/jobs. Model managers keep in close touch with model agents to ensure a shared vision for the model, but a manager stays mostly on the management end of the models career.

Is Django models a database?

A Django model is a table in your database.


1 Answers

In Django, a models' manager is the object through which models perform database queries. Each Django model has at least one manager, which is objects, and you can create your own to change the default behavior.

So, your statement

But these functions could also be placed in the Model too

Well, not really because the model is still depending on the default manager to retrieve the queryset.

Let me try to explain in terms of an example. Lets say your application requires a model object to show only objects with a status of published. Now, MyModel.objects.all() retrieves everything, and you would have to specify the filter MyModel.objects.filter(published=True) every single time.

Now, you can override this default behavior.

class MyModelAdmin(admin.ModelAdmin):

    def queryset(self, request):
        return MyModel.objects.filter(published=True)

What we just did was override the default behaviour of the default manager.

Now, lets say you want everything, You can do something like

class MyModelAdmin(admin.ModelAdmin):    
    def queryset(self, request):
        return MyModel.objects.filter(published=True)
    def all_objects(self, request):
        return MyModel.objects.all()

and while accessing all objects, just do

MyModel.objects.all_objects()

It is also possible to have multiple managers to a single model

In short, managers give a lot of flexibility in terms of accessing querysets to the model.

like image 168
karthikr Avatar answered Sep 17 '22 22:09

karthikr