【问题标题】:Django raw sql produces a queryset I can't iterate - CLOSEDDjango raw sql 生成一个我无法迭代的查询集 - 已关闭
【发布时间】:2012-04-27 14:32:56
【问题描述】:

我有一个返回两行的 sql 选择查询:

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);

但是,当我使用原始方法将其添加到 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 查询(我以为我上周检查并重新检查了它们)。向任何为此花费时间的人道歉。

【问题讨论】:

  • 关闭您的问题,添加一个答案(您自己的答案......这是您的代码或搜索参数中的错误)并接受它或将“CLOSED”放入问题标题中,这样人们就不会感到困惑。
  • 您应该为您自己的问题提供解决方案的答案,而不是编辑问题本身。然后,您可以将其标记为答案。
  • 谢谢 - 我已经相应地更新了。

标签: sql django django-queryset


【解决方案1】:

这是一个错误。我运行了错误的代码。

解决办法就是要小心点!

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多