django: вопрос новичка о запросе моделей

#django #django-models

#django #django-models

Вопрос:

У меня есть следующие таблицы:

 class SchoolClass(models.Model):
    id = models.AutoField(primary_key = True)
    class_name = models.TextField()
    level = models.IntegerField()
    taught_by = models.ManyToManyField(User,related_name="taught_by",through='TeachSubject')
    attended_by = models.ManyToManyField(User,related_name='attended_by')

class ConsentFormTemplate(models.Model):
    title = models.TextField()
    body = models.TextField()
    teacher_id = models.ForeignKey(User)
    consent_id = models.AutoField(primary_key = True)

    class Meta:
        db_table = "consent_form_template"

class ConsentForm(models.Model):
    student_id = models.ForeignKey(User)
    remarks = models.TextField()
    #class_id = models.ForeignKey(SchoolClass)

    reply = models.NullBooleanField()
    parents_remark = models.TextField()
    tpl = models.ForeignKey(ConsentFormTemplate)
    acknowledged_by = models.ForeignKey(User,related_name='acknowledged_by',null=True,blank=True)
    acknowledged_on = models.DateField(auto_now=True,auto_now_add=True,null=True)
    date_sent = models.DateField(auto_now=True,auto_now_add =True)
    class Meta:
        unique_together = ('tpl_id','studentId')

    class Meta:
        db_table = "consent_form"
  

Учитывая pk consentformtemplate, как я могу построить свой запрос ORM таким образом, чтобы мои результаты были такими:

 first_name(student) | class_name
  

Комментарии:

1. Какое first_name вы хотите? Преподавательский? Студенческий? Оба для каждого класса?

2. @arie, извини, Ари, я отредактировал свой вопрос его ученика

3. Лучше всего провести рефакторинг вашего кода. У вас есть несколько серьезных логических проблем, которые постоянно будут источником разочарования. Такие вещи, как student_id должны быть просто student , поскольку это внешний ключ. В противном случае вы получите запросы, которые включают в себя такие вещи, как student_id__id которые не имеют никакого смысла. Связанные имена также являются проблемой: related_name следует указать обратную связь. Поиск SchoolClass объектов через User объекты учителя через taught_by нелогичен.

Ответ №1:

 consentformtemplate=ConsentFormTemplate.objects.get(pk=consentformtemplate_pk)

consents = ConsentForm.objects.filter(tpl=consentformtemplate).select_related()

for consent in consents:
    print "%s | %s" % (consent.student_id.first_name, consent.class_id.class_name)