2010-05-31 37 views
8

Hy vọng rằng đây phải là một câu hỏi khá đơn giản, tôi chỉ không biết đủ về Python và Django để trả lời nó.Django: tạo truy vấn SQL thô, chuyển nhiều tham số lặp lại/lặp lại?

Tôi đã có một truy vấn SQL thô trong Django rằng phải mất sáu tham số khác nhau, hai người đầu tiên trong số đó (centreLat và centreLng) đang từng lặp đi lặp lại:

query = "SELECT units, (SQRT(((lat-%s)*(lat-%s)) + ((lng-%s)*(lng-%s)))) AS distance FROM places WHERE lat<%s AND lat>%s AND lon<%s AND lon>%s ORDER BY distance;" 
params = [centreLat,centreLng,swLat,neLat,swLng,neLng] 
places = Place.objects.raw(query, params) 

Làm thế nào để cấu trúc đối tượng paramsquery chuỗi để họ biết thông số nào cần lặp lại và ở đâu?

Trả lời

12

Bạn có (ít nhất) hai tùy chọn. Bạn có thể có thể bao gồm những thông số lặp đi lặp lại trong danh sách theo thứ tự mà họ cần phải xuất hiện - có nghĩa là bạn sẽ kết thúc với cùng một giá trị trong danh sách của bạn nhiều lần như thế này:

params = [centreLat,centreLng,swLat,neLat,swLng,neLng,centreLat,centreLng] 

OR, bạn có thể đặt tên cho từng tham số sử dụng một từ điển và thay vì sử dụng chỉ là một "% s" bạn có thể dùng "% (name) s" như thế này:

query = "SELECT units, (SQRT(((lat-%(lat)s)*(lat-%(lat)s)) + ((lng-%(lng)s)*(lng-%(lng)s)))) AS distance FROM places WHERE lat<%(lat)s AND lat>%(lat)s AND lon<%(lng)s AND lon>%(lng)s ORDER BY distance;" 
params = {'lat':centreLat,'lng':centreLng} 

(không sao chép mã mà đúng nguyên văn, tôi chắc chắn đó không phải là CHÍNH XÁC những gì bạn cần)

+3

Câu trả lời từ điển có vẻ tốt hơn đối với tôi. Tôi luôn muốn sử dụng các tham số có tên. Nó tốt hơn cho readabilty cũng có. –

Các vấn đề liên quan