django原始查询参数的问题

时间:2012-02-22 19:40:53

标签: django django-queryset

我试图为模型制作自定义原始查询,但我收到此错误:

  

DatabaseError:错误de sintaxis en o cerca de   «E'positions_statusrecord'»第1行:SELECT id FROM   E'positions_statusrecord'WHERE“type”= E'Leav ......

这是我正在尝试使用的原始查询(它是一种管理员方法):

def get_status_ids(self, model):
    """
    This query returns the latest statuses ids for each entry
    of "model" in StatusRecord.
    """
    db_table = self.model._meta.db_table
    model_type = model.get_status_type()

    raw_query = (
        "SELECT id "
        "FROM %s "
        "WHERE \"type\"=%s AND "
        "(identifier,date_time) IN "
               "( "
                          "SELECT identifier, Max(date_time) "
                          "FROM %s "
                          "WHERE \"type\"=%s "
                          "GROUP BY identifier"
               ")"
    )

    params = (db_table, model_type, db_table, model_type, )
    return self.raw(raw_query, params)

我尝试过更简单的查询(只是SELECT ... FROM ..)并遇到了同样的问题。似乎原始查询无法使用参数完成FROM部分。

我是对的吗?或者我犯了一个错误,我找不到它?

我正在使用postgreSQL 8.4.10,django 1.3和python 2.6。

我搜索了有关原始查询参数的信息,看看是否有一些禁止格式化选项,但我找不到任何可以帮助我的东西。

有谁知道是什么导致了这个错误?

1 个答案:

答案 0 :(得分:2)

  

似乎原始查询无法使用参数完成“FROM”部分。

是的,ORM将引用字符串参数,使其成为... FROM 'some_table' ...

由于db_table参数是可信的(不是来自用户输入),您可以执行以下操作:

raw_query = (
    "SELECT id "
    "FROM %s "
    "WHERE \"type\"=%%s AND "
    "(identifier,date_time) IN "
           "( "
                      "SELECT identifier, Max(date_time) "
                      "FROM %s "
                      "WHERE \"type\"=%%s "
                      "GROUP BY identifier"
           ")"
) % (db_table, db_table)
return self.raw(raw_query, (model_type, model_type))

Django Aggregation can be used in filters开始,您可以在不使用原始SQL的情况下获得相同的结果(另请参阅in lookup example)。

看看您是否可以将raw()替换为QuerySet.extra(),将SQL IN替换为EXISTS