جانغو - تحويل قائمة مرة أخرى إلى queryset [مكررة]
-
21-08-2019 - |
سؤال
هذا السؤال سبق الجواب هنا:
- أ QuerySet من إجمالي قيمة الحقل 3 إجابات
لدي عدد قليل من السجلات التي أود أن نوع على أساس احتساب قيمة.حصلت على الجواب هنا...مثل ذلك:
sorted(Profile.objects.all(), key=lambda p: p.reputation)
على تعريف الفئة مثل هذا:
class Profile(models.Model):
...
@property
def reputation(self):
...
للأسف العامة الرأي تتوقع queryset موضوع يلقي خطأ إذا أعطي قائمة.
هل هناك طريقة للقيام بذلك أن ترجع queryset
أو...
هل يمكنني تحويل القائمة إلى queryset بطريقة أو بأخرى ؟ لم أستطع العثور على أي شيء مثل هذا في جانغو مستندات.
وأنا على أمل أن لا denormalize البيانات ، ولكن أعتقد أنني إذا اضطررت.
تحديث / الجواب:
يبدو أن الطريقة الوحيدة للحصول على queryset مرة أخرى إذا كان يمكنك الحصول على كل منطق في استعلامات sql.
عندما يكون ذلك غير ممكن ، (أعتقد) تحتاج إلى denormalize البيانات
المحلول
لا يوجد أي نقطة في تحويل قائمة البيانات مرة أخرى إلى الاستعلام.استعلام كائن لا يحمل البيانات ؛ هو فقط يمثل الاستعلام إلى قاعدة البيانات.سيكون لديك لجلب كل شيء مرة أخرى إذا كنت جعل القائمة الخاصة بك إلى استعلام ، و التي من شأنها أن تكون زائدة عن الحاجة و أداء سيئا جدا الحكيم.
ما يمكنك القيام به:
- كيف تصف
reputation
الحقل غير حساب ؛ ربما من الممكن ترتيب البيانات في قاعدة البيانات بطريقة ما. - تعديل عرض لا تتطلب كائن الاستعلام.إذا كان يحتاج إلى القيام به تصفية إضافية.... الخهذا ينبغي القيام به من قبل أي طلب ، لأن الأمر سوف يستغرق وقتا أقل مع أقل إدخالات (وأقل البيانات سوف يتم جلبه من قاعدة البيانات.) لذا هل يمكن أن ترسل تصفية الاستعلام كائن إلى نوع وظيفة فقط قبل إرسالها إلى القالب (التي لا تهتم إذا كان في استعلام أو قائمة.)
نصائح أخرى
حسنا...هذا المنصب هو الآن من العمر ولكن ما يمكنك فعله هو الحصول على جميع ids
من الأشياء في القائمة الخاصة بك ، ثم إجراء model.objects.filter(pk__in=list_of_ids)