تعديل نتيجة استعلام Flask-SQLAlchemy
-
21-12-2019 - |
سؤال
أريد تعديل النتائج من استعلام flask-sqlalchemy قبل إرسالها إلى render_template()
.
يقوم العرض بالاستعلام عن العناصر وتعديلها:
items = Items.query
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
عندما يقوم القالب بإخراج العناصر:
{% for i in items %}{{i.date_modified}}{% endfor %}
يظهر هذا الخطأ في مصحح الأخطاء:
KeyError: 'date_modified'
ومع ذلك، إذا قمت بتعديل الاستعلام الأولي للحصول على كائن ترقيم الصفحات، فلن يظهر الخطأ وسيظهر تاريخ التعديل.
items = Items.query
items = items.paginate(page_num, items_per_page, True).items
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
ما الفرق بين نتيجة الاستعلام ونتيجة ترقيم الصفحات الذي يسمح بالتلاعب بالأخيرة في مكانها ولكن ليس بالأولى؟كيف يمكنني تعديل النتائج دون تعديل الاستعلام باستخدام ترقيم الصفحات؟
المحلول
في كلا المثالين تمر items
إلى القالب.ومع ذلك، items
القيمة مختلفة في كل حالة.
في المثال الأول، items
هو كائن الاستعلام من Items.query
.يمكن تكرار هذه القيمة، وهذا هو سبب عمل حلقة for.ولكن يجب تخزين العناصر في مكان دائم.في القالب، يتم تكرار الاستعلام مرة أخرى، ويتم إرجاع مثيلات العناصر الجديدة التي لم يتم تعديلها في طريقة العرض.
وفي المثال الثاني items
إنه نتيجة ل paginate
, ، قائمة Items
.عندما تقوم بتعديل كل عنصر، فإنه يظل مخزّنًا في القائمة، ويؤدي تكراره مرة أخرى في القالب إلى ظهور نفس العناصر.
لحل الخطأ من المثال الأول، تحتاج إلى تخزين المراجع إلى العناصر التي يتم إرجاعها.أسهل طريقة للقيام بذلك هي إجبار الاستعلام على إرجاع قائمة: items = Items.query.all()
.