2010-05-28 34 views
36

Cụ thể, tôi đang cố gắng sử dụng một chuỗi để lọc ORM một cách tùy ý. Tôi đã thử các giải pháp exec và eval, nhưng tôi đang chạy vào tường. Đoạn code dưới đây không làm việc, nhưng đó là cách tốt nhất mà tôi biết làm thế nào để giải thích mà tôi đang cố gắng để điLàm cách nào để sử dụng chuỗi làm đối số từ khóa?

from gblocks.models import Image 
f = 'image__endswith="jpg"' # Would be scripted in another area, but passed as text <user input> 
d = Image.objects.filter(f) 


#for the non-django pythonistas: 
d = Image.objects.filter(image__endswith="jpg") 
# would be the non-dynamic equivalent. 

Trả lời

69
d = Image.objects.filter(**{'image__endswith': "jpg"}) 
2

Tùy chọn eval nên làm việc tốt, miễn là bạn quấn nó xung quanh toàn bộ biểu hiện, không chỉ là f:

f = 'image__endswith="jpg"' 
d = eval('Image.objects.filter(' + f + ')') 
2

Bạn sẽ cần phải tách ra giá trị từ khóa, sau đó thiết lập một dict sử dụng từ khóa như chìa khóa, và giá trị như giá trị. Sau đó bạn có thể sử dụng tham số hàm dấu hoa thị kép với lệnh dict.

Vậy ...

keyword, sep, value = f.partition('=') 
kwargs = {keyword: value.strip('"')} 
d = Image.objects.filter(**kwargs) 

Lưu ý, mã này giả định rằng sẽ không có bất kỳ dấu bằng '=' vào từ khóa (họ sẽ chỉ được sử dụng để tách các từ khóa từ giá trị) và giá trị sẽ được bao gồm trong dấu ngoặc kép.

+0

Không bỏ qua. Sử dụng 'ast.literal_eval()' để thay thế. –

+0

Ok, liên quan đến điều đó sau đó, tôi có thể chỉ sử dụng một eval thường xuyên() nếu tôi cũng muốn bắt 'datetime.date (2005, 1, 3)' như là một bộ lọc hợp lệ? –

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