Reputation: 67
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
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