كيفية توفير اسم حقل البحث ديناميكيًا في استعلام جانغو؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/1227091

  •  22-07-2019
  •  | 
  •  

سؤال

أريد البحث عن سلسلة معينة في عدة مجالات للنموذج في جانغو.من الناحية المثالية، سيكون الأمر مشابهًا لما يلي:

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']
results = []
for field in fields:
    lookup = "%s__contains"
    results.append(Item.objects.filter(lookup=keyword))

بالطبع لن ينجح هذا، حيث لا يمكن حل "البحث" في الحقل.أهناك أي طريقة أخرى لعمل هذا؟

هل كانت مفيدة؟

المحلول

أعتقد أنه قد تكون هناك طريقة أفضل للقيام بذلك باستخدام نظام استعلام Django.إليك كيفية القيام بذلك بطريقتك.

تسمح لك Python بتمرير القواميس لاستخدامها كقوائم وسيطات عن طريق وضع بادئة لها بـ **.مع القليل من الحظ، يجب أن تكون قادرًا على القيام بشيء مثل هذا:

lookup = "%s__contains" % field
results.append(Item.objects.filter(**{ lookup: keyword}))

نصائح أخرى

أفضل استخدام كائن Q لشيء مثل هذا.

from django.db.models import Q

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

Qr = None
for field in fields:
    q = Q(**{"%s__contains" % field: keyword })
    if Qr:
        Qr = Qr | q # or & for filtering
    else:
        Qr = q

# this you can now combine with other filters, exclude etc.    
results = MyModel.objects.filter(Qr)

تعجبني إجابة DialZ ولكن لأسباب تتعلق بالأداء، يجب عليك إنشاء الاستعلام ثم الضغط على قاعدة البيانات مرة واحدة بدلاً من تجميع كافة النتائج في قائمة:

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

# this makes an empty queryset object which we can
# add to later using the | operator
results = Item.objects.none()

for field in fields:
    lookup = "%s__contains" % field
    query = {lookup : keyword}
    results = results | Item.objects.filter(**query)

لم أقم بأي من هذه الأشياء منذ فترة، لكنني متأكد تمامًا من أن Django لن يصل إلى قاعدة البيانات على الإطلاق في هذا الكود.سيتم إجراء استعلام فقط عند الوصول إلى البيانات الموجودة في السجلات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top