Skip to content


All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.


[2.1.2] - 2023-07-17


  • Fix an error when using the @out decorator on producer functions that return values like booleans, that can't have arbitrary attributes added to them (#86).


  • Add support for Django 4.2
  • Drop support for Python 3.7

[2.1.1] - 2023-03-21


  • Correctly set the allow_null attribute on nested serializers (#81)

[2.1.0] - 2023-01-13


  • Add support for Django 4.1
  • Drop support for Django 2.2
  • Add support for Python 3.11
  • Drop support for Python 3.6


  • In the Django REST framework layer, callables in a spec are now automatically called and passed the request object (#76)
  • Support for generating a Django REST framework serializer from a spec, and for annotating custom pairs in a spec with their output field types. This enables automatic schema generation. (#76)

[2.0.0] - 2022-07-19


  • BACKWARDS INCOMPATIBLE: The default value of the distinct argument for the pairs.count and pairs.has functions has changed from True to False. This now matches the default value of the distinct arguments to Django's Count annotation. To retain current behaviour, add distinct=True to all calls to these two functions in your codebase. For background on this decision, see this discussion.


  • Proper documentation!
  • New pairs.annotate function allowing you to annotate a queryset with aggregates, functions etc and produce the result.
  • New pairs.sum function to annotate a queryset with the Sum aggregate function and produce the result.

[1.1.0] - 2022-02-23


  • New pairs.discard_queryset_function and pairs.discard_projector functions to discard one or other item in a reader pair.


  • SpecMixin now applies prepare function in get_queryset, not filter_queryset

[1.0.0] - 2021-10-13

Initial stable release.