Purpose of using a custom manager to create objects with django? -


i see in django documentation :

model instance reference : creating objects

you may tempted customize model overriding __init__ method. if so, however, take care not change calling signature change may prevent model instance being saved.
rather overriding __init__, try using 1 of these approaches:

  • add classmethod on model class.
  • add method on custom manager (usually preferred)

why second solution "usually preferred" ?

in situation have model b extends model a through onetoone relation, , want create method generating b object generates corresponding a object well, how "better" use custom manager suggested, given i'll not use manager other provided default manager ?

i think preferred because looks cleaner in code. might reading emphasizes bit much, benefit or difference isn't big. said, when implementing things myself use proposed approach.

consider following model (purely illustrative purposes):

class vehicle(models.model):     wheels = models.integerfield()     color = models.charfield(max_length=100) 

in application, need arises cars, or motorcycles, or whatever type of vehicle. keep things dry, want standard form of retrieving data. using class methods, you'd following:

class vehicle(models.model):     #(...)     @classmethod     def cars(cls):         return vehicle.objects.filter(wheels=4)  cars = vehicle.cars() green_cars = vehicle.cars().filter(color='green') 

if create manager, you'll this:

class carmanager(models.manager):     def get_query_set(self):         return super(carmanager, self).get_query_set().filter(wheels=4)  class vehicle(models.model):     #(...)     car_objects = carmanager()  cars = vehicle.car_objects.all() green_cars = vehicle.car_objects.filter(color='green') 

in opinion, latter looks cleaner, when things more complex. keeps clutter out of model definitions, , keeps things similar using default objects manager.


Comments

Popular posts from this blog

matlab - Deleting rows with specific rules -

jquery - How would i go about shortening this code? And to cancel the previous click on click of new section? -