Как получить значение, на которое ссылаются в 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 запрос кажется немного диким...

Вернуться на верх