Bharath Subramani
Bharath Subramani

Reputation: 15

Query using Joins in Django

class Students(models.Model):
    id = models.BigAutoField(primary_key=True)
    admission_no = models.CharField(max_length=255)
    roll_no = models.CharField(unique=True, max_length=50, blank=True, null=True)
    academic_id = models.BigIntegerField()
    course_parent_id = models.BigIntegerField()
    course_id = models.BigIntegerField()
    first_name = models.CharField(max_length=20)
    middle_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    user_id = models.BigIntegerField()
    date_of_birth = models.DateField(blank=True, null=True)
    date_of_join = models.DateField(blank=True, null=True)

class Courses(models.Model):
    id = models.BigAutoField(primary_key=True)
    parent_id = models.IntegerField()
    course_title = models.CharField(max_length=50)
    slug = models.CharField(unique=True, max_length=50)
    tenant_user = models.ForeignKey('Users', models.DO_NOTHING, default='')
    course_code = models.CharField(max_length=20)
    course_dueration = models.IntegerField()
    grade_system = models.CharField(max_length=10)
    is_having_semister = models.IntegerField()
    is_having_elective_subjects = models.IntegerField()
    description = models.TextField()
    status = models.CharField(max_length=8)
    created_at = models.DateTimeField(blank=True, null=True)
    updated_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'courses'

    def __unicode__(self):
        return self.course_title

class StudentProfileSerializer(ModelSerializer):

    class Meta:
        model = Students
        depth = 0
        fields = '__all__'

The first two tables/class contains the course and student table and the third contains the serializer. Can anyone please help how to query using the joins in django. I need to fetch the course_title from Courses table and first_name from Students table.

Upvotes: 0

Views: 63

Answers (2)

IMHO, you should review your models; course_id in Students should be a course=models.ForeignKey('Courses', ...); this way you can refer to the course title using dot notation;

student=Student.objects.filter(pk=...)

to refer to your required fields:

student.last_name, student.course.course_title

Besides, if I understood your models, you could get some incongruence... what if the value stored in course_parent_id in Students model is different from the value stored in parent_id in Courses model? maybe the first one is redundant.

Upvotes: 1

Cory Madden
Cory Madden

Reputation: 5193

To query a field from a related object use a double underscore. So you could do

Student.objects.filter(**kwargs).values('first_name', 'last_name', 'course__course_name')

Upvotes: 0

Related Questions