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
Implement search with Django-haystack and Elasticsearch Part-1

Haystack works as search plugin for django. You can use different back ends Elastic-search, Whose, Sorl, Xapian to search objects. All backends work with same ...

Continue Reading...
Custom validations for serializer fields Django Rest Framework

we can write custom validations for serializer fields in Django Rest Framework. Validators are used to validate the data whether it is semantically valid or ...

Continue Reading...
How to create Custom User Model or Extend User Model in Django?

Django provides built in authentication which is good for most of the cases, but you may have needs that are being served with the existing ...

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