django中的复杂查询

时间:2010-02-19 16:53:16

标签: django model

Hay,我有一个非常复杂的查询,我无法在django工作。

我的模型名为Car(),我想在其上执行此查询

query = "SELECT *, ((ACOS(SIN("+user_lat+" * PI() / 180) * SIN(lat * PI() / 180) + COS("+user_lat+" * PI() / 180) * COS(lat * PI() / 180) * COS(("+user_lon+" - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance FROM app_car HAVING distance<='"+miles+"' ORDER BY distance ASC"

有什么想法吗?

由于

编辑:

我的观点看起来像这样

def find_cars_within_miles_from_postcode(request, miles, postcode=0):

    # create cursor for RAW query
    cursor = connection.cursor()

    # Get lat and lon from google
    lat, lon = getLonLatFromPostcode(postcode)

    # Gen query
    query = "SELECT id, ((ACOS(SIN("+lat+" * PI() / 180) * SIN(lat * PI() / 180) + COS("+lat+" * PI() / 180) * COS(lat * PI() / 180) * COS(("+lon+" - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance FROM app_car HAVING distance<='"+miles+"' ORDER BY distance ASC"

    # execute the query
    cursor.execute(query)

    # grab all the IDS form the sql result
    ids = [row[0] for row in cursor.fetchall()]

    # find cars from ids
    cars = Car.objects.filter(id__in=ids)

    # return the Cars with these IDS
    return HttpResponse( cars )

这可以从x英里数返回我的汽车,这很有效。然而,原始查询返回它们离某个位置的距离,我认为字段名称是“距离”。

如何将此字段“距离”与我的汽车对象一起返回?

4 个答案:

答案 0 :(得分:1)

Django ORM不支持HAVING;为此,请转到DB-API。

答案 1 :(得分:1)

看看这个SO post。它涵盖了您想要的地理查找。

答案 2 :(得分:0)

用户raw()方法和用于获取Cars对象的SQL查询。

答案 3 :(得分:0)

你很难在QerySet对象中返回距离值(参见my question on the same thing),至少在Django 1.2之前。最简单的方法是将查询移动到模型管理器中,但返回Python列表而不是查询集。您也可以查看Python的地理库来处理这些类型的查询。