-1

2つの行を返すSQLSelectクエリがあります。

SELECT contacts_patientcontact.contact_id, patient_firstname, recent_mailouts
FROM contacts_patientcontact
INNER JOIN patients_patientcore
ON contacts_patientcontact.patient_id = patients_patientcore.patient_id
LEFT JOIN   (SELECT contact_id, COUNT(*) as recent_mailouts
    FROM contacts_communicationinstance
    WHERE communication_type = 'questionnaire mailout'
    GROUP BY contact_id) mail_outs
ON contacts_patientcontact.contact_id = mail_outs.contact_id
WHERE contact_date BETWEEN '2012/03/05' AND '2012/03/12'
AND contact_type = 'Postal Questionnaire'
AND patient_dead != 1
AND consent_withdrawn IS NULL
AND lost_follow_up != 1
AND (key = 'A' OR key = 'C')
AND     (recent_mailouts < 1 
OR recent_mailouts IS NULL);

ただし、rawメソッドを使用してdjangoに追加すると、クエリセットは反復可能ではないようです。

def weekly_questionnaire_mailout_query(monday):
    """
    Returns a query set of PatientContact objects for patients
    due a mailout in the week following the parameter 'monday'.
    """
    nxt_monday = monday + datetime.timedelta(weeks=1)
    nxt_monday_str = nxt_monday.strftime('%Y/%m/%d')
    monday_str = monday.strftime('%Y/%m/%d')
    contacts = PatientContact.objects.raw("""
        SELECT contacts_patientcontact.contact_id
        FROM contacts_patientcontact
        INNER JOIN patients_patientcore
        ON contacts_patientcontact.patient_id = patients_patientcore.patient_id
        LEFT JOIN    (SELECT contact_id, COUNT(*) as recent_mailouts
                FROM contacts_communicationinstance
                WHERE communication_type = 'questionnaire mailout'
                GROUP BY contact_id) mail_outs
        ON contacts_patientcontact.contact_id = mail_outs.contact_id
        WHERE contact_date BETWEEN '%s' AND '%s'
        AND contact_type = 'Postal Questionnaire'
        AND patient_dead != 1
        AND consent_withdrawn IS NULL
        AND lost_follow_up != 1
        AND (cora = 'A' OR cora = 'C')
        AND     (recent_mailouts < 1 
            OR recent_mailouts IS NULL);   
        """  % (monday_str, nxt_monday_str)
    )
    return contacts

contacts = weekly_questionnaire_mailout_query(monday)
for contact in contacts:
    patients.add(contact.patient_id)

その最後の行に到達することはありません。(日付が正しいことを確認しました。以下にPatientContactモデルを含めました)。

class PatientContact(models.Model):
    contact_id = models.AutoField(primary_key=True)
    patient_id = models.ForeignKey(PatientCore, db_column="patient_id",
                               verbose_name="patient")
    # additional fields..

私はこれに戸惑っています-クエリセット内のアイテムを表示する代わりに、私の(pydevd)デバッガーはRawQuerySetオブジェクトを表示します。同じ関数(同じパラメーターを使用)は、djangotables2が正常に処理するオブジェクトを返します(SQL出力から期待するテーブルを生成します)。

編集

それは恥ずかしいことです-結局のところ日付でした-私は実際に同じSQLクエリを実行していませんでした(先週それらをチェックして再チェックしたと思いました)。これに時間を費やした人にはお詫びします。

4

1 に答える 1

0

これは間違いでした。間違ったコードを実行していました。

解決策はもっと注意することです!

于 2012-06-06T08:14:32.620 に答える