سؤال

هذا السؤال سبق الجواب هنا:

لدي عدد قليل من السجلات التي أود أن نوع على أساس احتساب قيمة.حصلت على الجواب هنا...مثل ذلك:

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)

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