Writing your own function¶
To create your own custom function, you just need to register it. The first argument to nlf_function will determine how the function can be referenced in filter expressions, the role parameters determines where the function can be used, while the model parameter can be used to restrict usability to certain models.
See the following example:
from django_nlf.functions import nlf_function
@nlf_function("myFunction")
def my_function(*args, **kwargs):
pass
The arguments are passed as strings as positional arguments, only quotes are removed. Additional context is available through key word arguments.
Currently the Model class being filtered, the Request and the View are passed as model, request and view respectively.
Value functions¶
If the function is used as a value, it can return anything appropriate for the field.
Field functions¶
If the function is used as a field, it must return a dictionary with a single key, the field name, and an annotation. This can be an F object, Aggragation, Subquery or even a Window.
Warning
Annotations are applied BEFORE all other filtering is done, therefore if you need to filter on a group, that must be handled as an expression function with a Subquery.
Expression functions¶
Expression functions are passed an additional keyword argument exclude to specify if the function has been negated (exclude=True) or not (exclude=False). It must return a tuple of a dictionary holding annotations as for field functions and a Q object.
Warning
Annotations are applied BEFORE all other filtering is done, therefore if you need to filter on a group, that must be handled as an expression function with a Subquery.