#17270: methods of the manager on subqueries QuerySet objects
-------------------------------------+-------------------------------------
Reporter: Wojciech Banaś | Owner: fizista@…
<fizista@…> | Status: new
Type: New feature | Version:
Component: Database layer | Keywords: queryset manager
(models, ORM) | Extends
Severity: Normal | Has patch: 1
Triage Stage: Unreviewed | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Extends the operation methods of the manager on subqueries QuerySet
objects.
The "standard manager" you can only like this:
{{{
SomeModel.object.some_method_manager().all().filter(...). ...
}}}
But this does not work:
{{{
SomeModel.object.all().some_method_manager()
}}}
And this it works with the use of this class / patches:
{{{
SomeModel.object.all().some_method_manager().filter(...).some_method_manager2().
...
SomeModel.object.some_method_manager().some_method_manager2().some_method_manager3().
...
}}}
Extension of the methods manager on all child objects "QuerySeth".
Example:
* class model
{{{
class Animals(models.Model):
type = models.CharField('Type of animal') # dog, cat, elephant
color = models.CharField('Colour Name')
objects = AnimalsManager()
}}}
* class manager
{{{
class AnimalsManager(ManagerQuerySetDecorator):
def get_dogs(self):
return self.get_query_set().filter(type='dog')
get_dogs.queryset_method = True
def get_cats(self):
return self.get_query_set().filter(type='cat')
get_cats.queryset_method = True
def get_white_animals(self):
return self.get_query_set().filter(color='white')
get_white_animals.queryset_method = True
def get_black_animals(self):
return self.get_query_set().filter(color='black')
get_black_animals.queryset_method = True
def get_brown_animals(self):
return self.get_query_set().filter(color='black')
}}}
* add models data
{{{
Animals(type='dog', color='black').save()
Animals(type='dog', color='bown').save()
Animals(type='dog', color='white').save()
Animals(type='cat', color='black').save()
Animals(type='cat', color='bown').save()
Animals(type='cat', color='white').save()
}}}
* examples of actions a new manager
{{{
animals = Animals.objects.get_black_animals().get_dogs()
# return list black dogs
animals = Animals.objects.get_white_animals().get_cats()
# return list white cats
# When ffff equals False, or not defined (as it is in
# the original model manager), we can not perform such an operation:
animals = Animals.objects.get_cats().get_brown_animals()
# return:
# AttributeError: 'QuerySet' object has no attribute
'get_brown_animals'
# but:
animals = Animals.objects.get_brown_animals().get_cats()
# return brown cats, because get_cat() present in all parent object
instances.
}}}
In Annex file a class action extends the manager.
If there is interest in this patch, then add in the future full of tests,
and prepare a ready-made patch for django code.
--
Ticket URL: <https://code.djangoproject.com/ticket/17270>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.