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.

    By Posted On
SENIOR DEVELOPER at MICROPYRAMID

Need any Help in your Project?Let's Talk

Latest Comments
Related Articles
How to Create initial django migrations for existing DB schema. Chaitanya Kattineni

Django provides the comfort database migrations from its version 1.8, with which we can avoid the usage of third party packages like south. Adding migrations ...

Continue Reading...
Integrating Gitlab in django project with gitlab api for gitlab authentication and access Nikhila Mergu

This is a simple way to integrate gitlab authentication in your django apps.

We can get user verified email id, general information, git lab URL ...

Continue Reading...
Preserve file names with sorl for better SEO Ashwin Kumar

We use sorl-thumbnail for scaling images by keeping the original one intact. Sorl proven to be great tool for generating different sized images throughout website. ...

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