Как получить значение, на которое ссылаются в django?
Здесь мне нужно получить student_id
в values
. Я определил s_id, но при вызове values()
он не отображается.
FeeSection.objects.get(id=1).section.sectionstudent_set.annotate(s_id=F('student__id')).get(student__id=1).qouta.feeqouta_set.all().values()
Этот запрос возвращает:
<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')}]>
что мне нужно: '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')}]>
Модели:
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)
get()
возвращает экземпляр модели, поэтому все, что следует после него, является новым SQL-запросом, независимо от того, сколько вы соединяете их вместе. Ваш код делает это прямо сейчас:
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()
Если вы хотите продолжить цепочку, вы должны заменить get()
на filter()
, однако результирующий SQL запрос кажется немного диким...