Pertanyaan Bagaimana cara menggunakan string sebagai argumen kata kunci?


Secara khusus, saya mencoba menggunakan string untuk arbitrairly menyaring ORM. Saya sudah mencoba solusi exec dan eval, tapi saya berlari ke dinding. Kode di bawah ini tidak berfungsi, tetapi ini adalah cara terbaik yang saya tahu cara menjelaskan ke mana saya mencoba pergi

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.

38
2018-05-28 21:26


asal


Jawaban:


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

72
2018-05-28 21:29



Anda harus membagi nilai dari kata kunci, lalu mengatur dict menggunakan kata kunci sebagai kunci, dan nilai sebagai nilai. Anda kemudian dapat menggunakan paramater fungsi asterik ganda dengan dict.

Begitu...

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

Catatan, kode ini mengasumsikan bahwa tidak akan ada tanda sama dengan '=' dalam kata kunci (kata kunci hanya akan digunakan untuk memisahkan kata kunci dari nilai), dan nilai akan dibungkus dalam tanda kutip.


3
2018-05-28 21:36



Itu eval pilihan harus berfungsi dengan baik, selama Anda membungkusnya di seluruh ekspresi, bukan hanya f:

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

2
2018-05-28 21:33