2011-09-30 44 views
25

Vì vậy, tôi có một dict được chuyển từ một trang web. Tôi muốn xây dựng truy vấn dựa trên dict. Tôi biết tôi có thể làm:SQLAlchemy - xây dựng bộ lọc truy vấn động từ dict

session.query(myClass).filter_by(**web_dict) 

Tuy nhiên, điều đó chỉ hoạt động khi giá trị khớp chính xác. Tôi cần phải lọc 'thích'. Nỗ lực tốt nhất của tôi khi sử dụng thuộc tính __dict__:

for k,v in web_dict.items(): 
    q = session.query(myClass).filter(myClass.__dict__[k].like('%%%s%%' % v)) 

Không chắc chắn cách tạo truy vấn từ đó. Bất cứ sự giúp đỡ nào cũng thật sự tuyệt vời.

Trả lời

38

Bạn đang đi đúng hướng!

Điều đầu tiên bạn muốn làm khác là thuộc tính truy cập sử dụng getattr, không phải __dict__; getattr sẽ luôn làm điều đúng, ngay cả khi (có thể là trường hợp cho các mô hình phức tạp hơn) một thuộc tính được ánh xạ không phải là thuộc tính cột.

Phần còn thiếu khác là bạn có thể chỉ định filter() nhiều lần và chỉ thay thế đối tượng truy vấn cũ bằng kết quả của cuộc gọi phương thức đó. Vì vậy, về cơ bản:

q = session.query(myClass) 
for attr, value in web_dict.items(): 
    q = q.filter(getattr(myClass, attr).like("%%%s%%" % value)) 
+2

TokenMacGuy tấn công một lần nữa. Cue âm nhạc ... – MFB

+1

Lol, đưa tôi trở lại ... :) – MFB

+3

xin vui lòng không spam trong bình luận ..! – PersianGulf

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