Skip to main content

A string-based Django query language

Project description

Unit test status Documentation Status PyPI - Python Version PyPi Version

Djaq - pronounced “Jack” - is an alternative to the Django QuerySet API.

What sets it apart:

  • No need to import models

  • Clearer, more natural query syntax

  • More powerful expressions

  • More consistent query syntax without resorting to idiosyncratic methods like F() expressions, annotate(), aggregate()

  • Column expressions are entirely evaluated in the database

  • Extensible: you can write your own functions

  • Pandas: Easily turn a query into Pandas Dataframe

There is also a JSON representation of queries, so you can send queries from a client. It’s an instant API to your data. No need to write backend classes and serializers.

Djaq queries are strings. A query string for our example dataset might look like this:

DQ("Book", "name as title, publisher.name as publisher").go()

This retrieves a list of book titles with book publisher. But you can formulate far more sophisticated queries; see below. You can send Djaq queries from any language, Java, Javascript, golang, etc. to a Django application and get results as JSON. In contrast to REST frameworks, like TastyPie or Django Rest Framework (DRF), you have natural access to the Django ORM from the client.

Djaq sits on top of the Django ORM. It can happily be used alongside QuerySets.

Here’s an example comparison between Djaq and Django QuerySets that gets every publisher and counts the books for each that are above and below a rating threshold.

DQ("Book", """publisher.name,
    sumif(rating < 3, 1, 0) as below_3,
    sumif(rating >= 3, 1, 0) as above_3
    """)

compared to QuerySet:

from django.db.models import Count, Q
above_3 = Count('book', filter=Q(book__rating__gt=3))
below_3 = Count('book', filter=Q(book__rating__lte=3))
Publisher.objects.annotate(below_3=below_3).annotate(above_3=above_3)

Get average, maximum, minimum price of books:

DQ("Book", "avg(price), max(price), min(price)")

compared to QuerySet:

Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))

Get the difference from the average off the maximum price for each publisher:

DQ("Book", "publisher.name, max(price) - avg(price) as price_diff")

compared to QuerySet:

from django.db.models import Avg, Max
Book.objects.values("publisher__name") \
   .annotate(price_diff=Max('price') - Avg('price'))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Djaq-1.0.6.tar.gz (30.3 kB view details)

Uploaded Source

File details

Details for the file Djaq-1.0.6.tar.gz.

File metadata

  • Download URL: Djaq-1.0.6.tar.gz
  • Upload date:
  • Size: 30.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for Djaq-1.0.6.tar.gz
Algorithm Hash digest
SHA256 138af2b089ee53710778e44c7584fc75f565a37cd032f1b2d94d146ad7e8ccb1
MD5 e06fd55e5b6e33155cbaa221f6cdb819
BLAKE2b-256 262de544744a72aa5fd5092292dec63572696391fbcfc558ddf84a5176a75bf2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page