按任意模型字段分组
django-group-b的Python项目详细描述
此包为Django查询集提供了一个MIXIN,添加了一个方法^ {TT1}$ 其行为主要类似于values方法,但有一点不同:它的迭代器不 返回字典,但返回一个model-like对象,该对象具有相关值的模型实例。
安装
从pypi安装:
pip install django-group-by
兼容性
这个包与django 1.8、1.9和1.10以及python版本2.7、3.4、3.5和3.6兼容。 可能还有其他的,但这12种组合正是我们所要建立的(travis ci)。
用法
使用GroupByMixin创建一个queryset子类,以在模型的管理器中使用:
# 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() ...
然后像values一样使用它,您将得到一个类似的查询集:
>>> some_rows = Book.objects.group_by('title', 'author', 'author__nationality').distinct() >>> some_rows.count() 4
不同之处在于,每一行不是一个字典,而是一个aggregatedgroup实例,只有分组字段:
>>> row = some_rows[0] >>> row <AggregatedGroup for Book> >>> row.title The Colour of Magic >>> row.publication_date *** AttributeError: 'AggregatedGroup' object has no attribute 'publication_date'
当然,它的主要优点是,您还可以根据需要获得相关的模型实例:
>>> row.author <Author: Terry Pratchett> >>> row.author_nationality <Nation: Great Britain>