How to filter a Django Queryset using Extra

SQL Query in Django ORM:

Using Django ORM we can perform all queryset operations. In some cases, we need to use SQL Queries in Django ORM. Here is the scenario if a model having a field with positiveInteger of another model, When I want to get an object of this positive Integer Field we will Query again for that model, By this number of Queries will be increased to reduce this we will use SQL Query to get appropriate results in single Query.

testapp/models.py

class State(models.Model):

    name=models.CharField(max_length=150)

class City(models.Model):

    name=models.CharField(max_length=150)

class Student(models.Model):

    name=models.CharField(max_length=150)

    state_id=models.PositiveIntegerField()

    city_id=models.PositiveIntegerField()

    is_active = models.BooleanField(default=False)

Here Student Model is having state and city as positiveInteger which provides the ID of state model and city model. In this case, when the student details required for every object we should query again to get state name and city name. By using extra({}) in the Django ORM we can filter state and city objects with single query

students = Student.objects.filter(

        is_active=True,

    ).extra(

        select={

            'state':

                'SELECT name FROM state WHERE '

                'state.id = '

                'testapp_student.state_id',

            'city':

                'SELECT name FROM city WHERE '

                'city.id = '

                'testapp_student.city_id',

        },

    )

By Using select in extra({}) provides state object and city object instead of their IDs with a single query.

In the above Query, we are first filtering student objects with active, for each student object executes a select query to filter state object and city object with the provided state_id and city_id.

Posted On 30 October 2017 By MicroPyramid


Need any Help in your Project?Let's Talk

Latest Comments
Related Articles
Introduction to Django's Class based views - Understanding how a class based view works

Django has MVT architecture. A view in django is just a callable that takes a request and returns a response. But this can be more ...

Continue Reading...
Get count, average, min, max values from model field using Django Aggregate

To retrieve maximum, minimum or average values from group of rows we can use django Aggregation. For example to retrieve max price or avg price ...

Continue Reading...
Hosting Django Application with Nginx and UWSGI

Django is a python based web- application development framework. Setting up a sample app and running it as easy as pie. Nginx is a webserver ...

Continue Reading...
open source packages

Subscribe To our news letter

Subscribe and Stay Updated about our Webinars, news and articles on Django, Python, Machine Learning, Amazon Web Services, DevOps, Salesforce, ReactJS, AngularJS, React Native.
* We don't provide your email contact details to any third parties