2014-02-16 2 views
3

Я в тупике. У меня есть три модели, определенные в Peewee Thusly:Несколько соединений в peewee

class Patient(BaseModel): 
    patientIdx = IntegerField() 
    gender = CharField() 
    firstName = CharField() 
    middleInit = CharField() 
    lastName = CharField() 
    provider = ForeignKeyField(User) 
    MRN = CharField() 
    class Meta: 
     database = database 

class Metrics(BaseModel): 
    metricId = CharField() 
    metricDescription = CharField() 
    ptListDescription = CharField() 
    class Meta: 
     database = database 

class PatientMetric(BaseModel): 
    metric = ForeignKeyField(Metrics) 
    patient = ForeignKeyField(Patient) 
    class Meta: 
     database = database 

Я пытаюсь выразить этот запрос с использованием MYSQL PeeWee:

select m.metricId, p.id from 
patient as p 
join patientmetric pm on p.id = pm.patient_id 
join metrics m on pm.metric_id = m.id 
where provider_id = 91 

В принципе, просто дать мне список пациентов и идентификатор их показатели для данного поставщика. Довольно просто, но я не могу понять, как заставить peewee сделать это. Я попытался связать соединения, но peewee не может разрешить внешние ключи. Я попытался с помощью .join несколько различных способов, и .from_ метода, например:

Metrics.select() 
     .from_(
      PatientMetric.select().join(Patient).where(Patient.provider == provider), 
      Metrics) 
     .where(Metrics.id == PatientMetric.metric) 

В этом случае, MySql жаловалась, что псевдоним для производной таблицы, необходимой для создания. Я думаю, что я лаю неправильное дерево, и есть простой способ построить этот запрос в peewee, но я в тупике. Может ли кто-нибудь показать мне «правильный» способ?

ответ

3
query = (Patient 
     .select(Metrics.metricId, Patient.id) 
     .join(PatientMetric) 
     .join(Metrics) 
     .where(Patient.provider == 91) 
     .tuples() # <-- since you just need the metric id and patient id 
) 
Смежные вопросы