[Fixed]-How to do this join query in Django


This can be done in Django, but you will need to restructure your models a little bit differently:

class Product(models.Model):
    name = models.CharField(max_length=50)
    product_rank = models.OneToOneField('ProductRank')

class ProductRank(models.Model):
    rank = models.IntegerField(default=0)

Now, when fetching Product objects, you can following the one-to-one relationship in one query using the select_related() method:


This will produce one query that fetches product ranks using a join:

SELECT "example_product"."id", "example_product"."name", "example_product"."product_rank_id", "example_productrank"."id", "example_productrank"."rank" FROM "example_product" INNER JOIN "example_productrank" ON ("example_product"."product_rank_id" = "example_productrank"."id")

I had to move the relationship field between Product and ProductRank to the Product model because it looks like select_related() follows foreign keys in one direction only.


I haven’t checked but:

products = Product.objects.filter(categories__pk=1).select_related()

Should grab every instance.



Add a call to the QuerySet‘s select_related() method, though I’m not positive that grabs references in both directions, it is the most likely answer.


For Django 2.1
From documentation

This example retrieves all Entry objects with a Blog whose name is ‘Beatles Blog’:

 Entry.objects.filter(blog__name='Beatles Blog')



Leave a comment