Chain together multiple (disparate) QuerySets to treat them as a single QuerySet.
Project description
The QuerySetSequence wrapper helps to deal with disparate QuerySet classes, while treating them as a single QuerySet.
Supported Features
Listed below are features of Django’s QuerySets that QuerySetSequence implements. The behavior should match that of QuerySet, but applied across multiple QuerySets:
Methods that take a list of fields (e.g. filter(), exclude(), get(), order_by()) must use fields that are common across all sub-QuerySets.
Relationships across related models work (e.g. 'foo__bar', 'foo', or 'foo_id'). syntax).
The sub-QuerySets are evaluated as late as possible (e.g. during iteration, slicing, pickling, repr()/len()/list()/bool() calls).
Public QuerySet API methods that are untested/unimplemented raise NotImplementedError. AttributeError is raised on attributes not explictly inherited from QuerySet.
Method |
Implemented? |
Notes |
---|---|---|
✓ |
||
✓ |
||
✗ |
||
✓ |
Does not support random order_by() (e.g. order_by('?')) |
|
✓ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✓ |
||
✓ |
||
✓ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✓ |
||
✗ |
Cannot be implemented in QuerySetSequence. |
|
✗ |
Cannot be implemented in QuerySetSequence. |
|
✗ |
Cannot be implemented in QuerySetSequence. |
|
✗ |
Cannot be implemented in QuerySetSequence. |
|
✓ |
||
✗ |
Cannot be implemented in QuerySetSequence. |
|
✓ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✗ |
||
✓ |
||
✗ |
Cannot be implemented in QuerySetSequence. |
|
✓ |
||
✓ |
Requirements
Python (2.7, 3.4, 3.5)
Django (1.8, 1.9)
Installation
Install the package using pip.
pip install --upgrade django-querysetsequence
Usage
# Import QuerySetSequence
from queryset_sequence import QuerySetSequence
# Create QuerySets you want to chain.
from .models import SomeModel, OtherModel
# Chain them together.
query = QuerySetSequence(SomeModel.objects.all(), OtherModel.objects.all())
# Use query as if it were a QuerySet! E.g. in a ListView.
Example
class Author(models.Model):
name = models.CharField(max_length=50)
class Meta:
ordering = ['name']
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author)
def __str__(self):
return "%s by %s" % (self.title, self.author)
class Book(models.Model):
title = models.CharField(max_length=50)
author = models.ForeignKey(Author)
release = models.DateField(auto_now_add=True)
def __str__(self):
return "%s by %s" % (self.title, self.author)
# Create some data.
alice = Author.objects.create(name='Alice')
article = Article.objects.create(title='Dancing with Django', author=alice)
bob = Author.objects.create(name='Bob')
article = Article.objects.create(title='Django-isms', author=bob)
article = Book.objects.create(title='Biography', author=bob)
# Create some QuerySets.
books = Book.objects.all()
articles = Article.objects.all()
# Combine them into a single iterable.
published_works = QuerySetSequence(books, articles)
# Find Bob's titles.
bob_works = published_works.filter(author=bob)
# Still an iterable.
print([w.title for w in bob_works]) # prints: ['Biography', 'Django-isms']
# Alphabetize the QuerySet.
published_works = published_works.order_by('title')
print([w.title for w in published_works]) # prints ['Biography', 'Dancing with Django', 'Django-isms']
Attribution
This is based on a few DjangoSnippets that had been going around:
Originally from https://www.djangosnippets.org/snippets/1103/
Modified version from https://djangosnippets.org/snippets/1253/
Upgraded version from https://djangosnippets.org/snippets/1933/
Updated version from django-ko-demo from The Atlantic
Contribute
Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug.
Fork the repository on GitHub to start making your changes.
Write a test which shows that the bug was fixed or that the feature works as expected.
Send a pull request and bug the maintainer until it gets merged and published.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for django_querysetsequence-0.5-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3bc9a2802dac9d9d02398ae585bbfb0663e17e7d9a4cb0ea2c57ae0676353c3e |
|
MD5 | 53aaa460ab1facc895b13f63c6c6e8c6 |
|
BLAKE2b-256 | 4dbd920e837620f884c4113c4ef66de134d1cdec66754e3ded771329f4c42331 |