2016-06-09 14 views
-1

Ich verwende django v1.8Django: Zugriff auf Felder in verketteten Queysets mit for-Schleife?

Ich muss Modelle in models.py:

class Demographic: 
    patient_id = models.IntegerField(unique= True ,primary_key=True) 
    age = models.IntegerField(null=True,blank=True) 

class MyTest: 
    patient = models.ForeignKey(Demographic) 
    date_vaccination = models.DateField(null=True,blank=True) 

der date_vaccination Bezug und die age des Patienten I für alle Patienten finden möchten, die ihr Alter geimpft wurden, wenn Sie geimpften.

Und dieses Ergebnis möchte ich es mit chartit Modul Diagramm zeigen.

In views.py ich habe:

total_patients = Demographic.objects.filter(mytest__date_vaccination__isnull = False) 
total_patients_vac = MyTest.objects.filter(date_vaccination__isnull = False) 

result_list = list(chain(total_patients, total_patients_vac)) 

I Kette bin mit diesen querysets zur Liste hinzuzufügen. Dann möchte ich für jeden Patienten sein Alter berechnen, wenn sie geimpft wurden, um es in der Tabelle zu zeigen.

Wenn ich versuche, die verketteten Liste ich den Fehler zu wiederholen 'MyTest' object has no attribute 'age'

for e in result_list: 
     print e.age 

Ich will das haben:

x = e.age - e.date_vaccination 

in der for-Schleife und fügen Sie das Ergebnis in eine neue Liste.

+0

Ich weiß nicht einmal, was Sie mit "e.Demographic.age" zu tun versuchen. –

+0

@ShangWang Ich verkette zwei Abfragegruppen. Clinical_data_two hat einen Fremdschlüssel für Demographic. Ich möchte auf ein bestimmtes Feld von Demographic und eines von Clinical_data_two für jeden Patienten zugreifen. Beide Felder sind Datetime. – zinon

+0

Shang, kannst du besser erklären, was willst du? Es ist ein bisschen verwirrend. – Rubico

Antwort

1

Zinon,

wie ich verstehen konnte, was Sie wollen. Sie möchten das gesamte Alter der Patienten, die vakziniert wurden, erhalten.

Ich würde diese Kettenmethode nicht verwenden, da das Django ORM intelligent genug ist, um die Daten für Sie aus der MyTest-Klasse zu erhalten.

vaccines = MyTest.objects.filter(date_vaccination__isnull = False) 
for vaccine in vaccines: 
    age = vaccine.patient.age 
    vaccine_date = vaccine.date_vaccination 

Dies geschieht, weil, wenn Sie die models.ForeignKey auf einem Django-Modell erklären Sie sind nicht nur eine Nummer dort setzen (auf der Datenbank Sie sind), können Sie den Zugriff auf das reale Demographic Objekt haben nur vaccine.patient tun

class MyTest: 
    patient = models.ForeignKey(Demographic) 
    date_vaccination = models.DateField(null=True,blank=True) 

Übrigens, ich kenne Ihre wirklichen Bedürfnisse nicht, aber würde das Alter eines Patienten nicht speichern, da dies mit dem Geburtstag des Patienten berechnet werden kann. Ich würde einfach seinen Geburtstag speichern und sein Alter nach dem Impfdatum berechnen.

+0

Vielen Dank! Das ist die richtige Lösung! – zinon