Group by arbitrary model fields
This package provides a mixin for Django QuerySets that adds a method group_by that behaves mostly like the values method, but with one difference: its iterator does not return dictionaries, but a model-like object with model instances for related values.
Install from PyPI:
pip install django-group-by
This package is compatible with Django 1.8 and 1.9, and Python versions 2.7, 3.4 and 3.5. Probably others, but those 6 combinations are the ones against which we build (by Travis CI).
Create a QuerySet subclass with the GroupByMixin to use in a model’s manager:
# models.py from django.db import models from django.db.models.query import QuerySet from django_group_by import GroupByMixin class BookQuerySet(QuerySet, GroupByMixin): pass class Book(Model): objects = BookQuerySet.as_manager() title = models.CharField(max_length=100) author = models.ForeignKey('another_app.Author') publication_date = models.DateField() ...
Then use it just like values, and you’ll get a similar query set:
>>> some_rows = Book.objects.group_by('title', 'author', 'author__nationality').distinct() >>> some_rows.count() 4
The difference is that every row is not a dictionary but an AggregatedGroup instance, with only the grouped fields:
>>> row = some_rows >>> row <AggregatedGroup for Book> >>> row.title The Colour of Magic >>> row.publication_date *** AttributeError: 'AggregatedGroup' object has no attribute 'publication_date'
But of course the main advantage is that you also get related model instances, as far as you want:
>>> row.author <Author: Terry Pratchett> >>> row.author_nationality <Nation: Great Britain>
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size & hash SHA256 hash help||File type||Python version||Upload date|
|django_group_by-0.2.2-py2.py3-none-any.whl (8.6 kB) Copy SHA256 hash SHA256||Wheel||py2.py3||Jun 21, 2016|
|django_group_by-0.2.2.tar.gz (5.5 kB) Copy SHA256 hash SHA256||Source||None||Jun 21, 2016|