Yeamin Mahmud
Yeamin Mahmud

Reputation: 67

How to get the value being referenced in django?

Here I need to get the student_id in the values. I have defined s_id but if values() is called it does not show.

FeeSection.objects.get(id=1).section.sectionstudent_set.annotate(s_id=F('student__id')).get(student__id=1).qouta.feeqouta_set.all().values()

This query returns:

<QuerySet [{'id': 1, 'qouta_id': 2, 'type_id': 1, 'amount': Decimal('200.00')}, {'id': 2, 'qouta_id': 2, 'type_id': 2, 'amount': Decimal('10.00')}]>

what I need is: 's_id':1

<QuerySet [{'id': 1,'s_id':1, 'qouta_id': 2, 'type_id': 1, 'amount': Decimal('200.00')}, {'id': 2, 's_id':1,'qouta_id': 2, 'type_id': 2, 'amount': Decimal('10.00')}]>

Models:

class SectionStudent(models.Model):
    student = models.ForeignKey('users.Student', on_delete=models.CASCADE)
    section = models.ForeignKey(Section, on_delete=models.CASCADE, )
    roll = models.IntegerField()
    qouta = models.ForeignKey(Qouta, on_delete=models.CASCADE)


class FeeQouta(models.Model):
    qouta = models.ForeignKey(to='section.qouta', on_delete=models.CASCADE)
    type = models.ForeignKey(FeeType, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
class FeeSection(models.Model):
    section = models.ForeignKey('section.Section', on_delete=models.CASCADE)
    month = models.IntegerField(choices=MONTH_CHOICES, default=datetime.datetime.now().month)
    year = models.IntegerField(choices=YEAR_CHOICES, default=datetime.datetime.now().year)
class Section(models.Model):
    section = models.CharField(max_length=1, verbose_name='section')
    branch = models.ForeignKey(Branch, on_delete=models.CASCADE)
    shift = models.ForeignKey(Shift, on_delete=models.DO_NOTHING)
    cls = models.ForeignKey(Class, on_delete=models.CASCADE, verbose_name='Class')
    version = models.ForeignKey(Version, on_delete=models.DO_NOTHING)
    year = models.IntegerField(choices=YEAR_CHOICES, default=datetime.datetime.now().year)

class Student(models.Model):
    sid = models.CharField(verbose_name='Student ID', max_length=10, unique=True)

class Qouta(models.Model):
    name = models.CharField(max_length=20)
    version = models.ForeignKey(Version, on_delete=models.PROTECT)
    cls = models.ForeignKey(Class, on_delete=models.PROTECT, verbose_name='Class')

Upvotes: 0

Views: 46

Answers (1)

yedpodtrzitko
yedpodtrzitko

Reputation: 9359

get() returns a model instance, so anything following after it is basically a new SQL query, no matter how much are you chaining it together. Your code does this right now:

fee_section = FeeSection.objects.get(id=1)
# this starts new SQL query from zero
section_student = fee_section.section.sectionstudent_set.annotate(s_id=F('student__id')).get(student__id=1) 
# this starts new SQL query from zero, `annotate()` from above get lost
fee_quotas = fee_section.qouta.feeqouta_set.all().values()

If you want to keep chaining things, you have to replace your get() with filter(), however the resulting SQL query seems a bit wild...

Upvotes: 1

Related Questions