Skip to content

Instantly share code, notes, and snippets.

@c4urself
Created February 7, 2012 21:43
Show Gist options
  • Select an option

  • Save c4urself/1762270 to your computer and use it in GitHub Desktop.

Select an option

Save c4urself/1762270 to your computer and use it in GitHub Desktop.
Django ORM INNER JOIN SQL test
from django.db import models
class Banana(models.Model):
name = models.CharField(max_length=255)
father = models.ForeignKey('self', null=True)
def __unicode__(self):
return self.name
#>>> Banana.objects.all()
#[<Banana: John>, <Banana: Peter>, <Banana: Bob>]
#>>> Banana.objects.create(name="Chris", father=Banana.objects.all()[2])
#<Banana: Chris>
#>>> Banana.objects.filter(father__name="Bob")
#[<Banana: Chris>]
# Last ORM query does the following SQL:
# SELECT "main_banana"."id",
# "main_banana"."name",
# "main_banana"."father_id"
# FROM "main_banana"
# INNER JOIN "main_banana" T2 ON ("main_banana"."father_id" = T2."id") WHERE T2."name" = Bob LIMIT 21'
@codingEzio
Copy link

codingEzio commented Feb 19, 2020

For anyone (new to Django) is interested in the self, here's the explanation:

# reference: https://books.agiliq.com/projects/django-orm-cookbook/en/latest/self_fk.html

class Employee(models.Model):
    manager = models.ForeignKey('self', on_delete=models.CASCADE)

# OR

class Employee(models.Model):
    manager = models.ForeignKey("app.Employee", on_delete=models.CASCADE)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment