2017-02-21 5 views
0

Предполагается, что у нас есть модель Patient и Diagnosis.Как получить связанное значение поля элемента в наборе запросов внутри цикла

class Patient(models.Model): 
    name = models.CharField() 

class Diagnosis(models.Model): 
    patient = models.ForeignKey(
     Patient, 
     related_name='diagnoses', 
     on_delete=models.CASCADE 
    ) 

    is_active = models.BooleanField() 

В моем views.py я был в состоянии отфильтровать пациент, у которого диагноз is_active=True с этим кодом.

# returns queryset whose patient has active diagnosis. 
queryset = Patient.objects.filter(
    diagnoses__is_active = True 
) 

Но я не могу получить значение, используя для этого цикл. Я добавил комментарий с ошибками im.

for qs in queryset: 
    # 'RelatedManager' object has no attribute 'is_active' 
    print qs.diagnoses.is_active 

    # 'Patient' object has no attribute 'diagnoses__is_active' 
    print qs.diagnoses__is_active 

    # There is no error from this code but 
    # i got the 'diagnoses.Diagnoses.None' in return 
    print qs.diagnoses 

Как это возможно быть, когда я был в состоянии фильтровать QuerySet в первую очередь?

ответ

3

Каждый объект пациента будет иметь набор связанных с ним объектов диагностики.

Когда вы делаете for qs in queryset:, qs становится пациентом.

И тогда, qs.diagnoses является RelatedManager, который может быть использован для получения всех связанных Диагностика объектов, но вам нужно сделать:

qs.diagnoses.all()

Или, может быть,

qs.diagnoses.filter(is_active=True) если вы заинтересованы только в активах.

+0

Спасибо за это! это действительно работает, вы спасли мое время здесь. sir –

+0

Я рад, что это было полезно. Не забудьте выбрать принятый ответ =) – JoseKilo

1

У каждого qs было много диагнозов, т. Е. qs.diagnoses Это новый запрос. Вам нужно использовать итерацию, чтобы получить диагноз. Попробуйте следующее:

for diagnose in qs.diagnoses.all(): 
    print diagnose.is_active 

 Смежные вопросы

  • Нет связанных вопросов^_^