Usage

To use Django Delayed Union in a project, import the wrapper corresponding to the operation needed:

from django_delayed_union import DelayedUnionQuerySet
from django_delayed_union import DelayedIntersectionQuerySet
from django_delayed_union import DelayedDifferenceQuerySet

Then, you use them where you would use Django’s union, intersection, and difference methods:

>>> qs0.union(qs1, qs2)
>>> DelayedUnionQuerySet(qs0, qs1, qs2)

>>> qs0.union(qs1, qs2, all=True)
>>> DelayedUnionQuerySet(qs0, qs1, qs2, all=True)

>>> qs0.intersection(qs1)
>>> DelayedIntersectionQuerySet(qs0, qs1)

>>> qs0.difference(qs1)
>>> DelayedDifferenceQuerySet(qs0, qs1)

These wrappers implement the same public interface as Django’s QuerySet so they should be able to be used by code which expects a QuerySet.

Note

DelayedQuerySet does not subclass QuerySet so any code which checks for whether or not an object is an instance of QuerySet will not work with these wrappers.

Note

If certain methods are unimplemented or will not work, they will raise a NotImplementedError as opposed to silently not working.

Custom QuerySet methods

Currently, the wrappers do not handle any custom methods that may have been added to the component querysets. For example, if qs0 and qs1 were instances of a subclass of QuerySet that had an active() method, then the following would not work:

>>> DelayedUnionQuerySet(q0, qs1).active()
Traceback (most recent call last)
 ...
AttributeError

Where this functionality is needed, it is straightforward to make a subclass of DelayedUnionQuerySet using which has this behavior:

from django_delayed_union.base import PassthroughMethod

class MyDelayedUnionQuerySet(DelayedUnionQuerySet):
    active = PassthroughMethod()

>>> MyDelayedUnionQuerySet(qs0, qs1).active()

Check out the other subclasses of django_delayed_union.base.DelayedQuerySetDescriptor if you need the resulting method to behave differently than PassthroughMethod.