سؤال

لدي QuerySet، دعنا نسميها qs, ، والتي يتم ترتيبها بواسطة بعض السمات التي لا علاقة لها بهذه المشكلة.إذن لدي شيء، دعنا نسميه obj.الآن أود أن أعرف في أي مؤشر obj يوجد في qs, ، مثل بكفاءة بقدر الإمكان.وأنا أعلم أنه يمكنني استخدامها .index() من بايثون أو ربما من خلال حلقة qs مقارنة كل كائن به obj, ، ولكن ما هي أفضل طريقة للقيام بذلك؟أنا أبحث عن الأداء العالي وهذا هو معياري الوحيد.

استخدام Python 2.6.2 مع Django 1.0.2 على نظام Windows.

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

المحلول

مجموعات الاستعلام في Django هي في الواقع مولدات، وليست قوائم (لمزيد من التفاصيل، راجع وثائق جانغو على QuerySets).
على هذا النحو، لا يوجد اختصار للحصول على فهرس عنصر ما، وأعتقد أن التكرار البسيط هو أفضل طريقة للقيام بذلك.

بالنسبة للمبتدئين، سأقوم بتنفيذ متطلباتك بأبسط طريقة ممكنة (مثل التكرار)؛إذا كانت لديك بالفعل مشكلات في الأداء، فسأستخدم أسلوبًا مختلفًا، مثل إنشاء مجموعة استعلام تحتوي على كمية أقل من الحقول، أو أي شيء آخر.
على أية حال، الفكرة هي ترك مثل هذه الحيل في وقت متأخر قدر الإمكان، عندما تعلم بالتأكيد أنك بحاجة إليها.
تحديث: قد ترغب في استخدام بعض عبارات SQL مباشرةً للحصول على رقم الصف (شيء يكذب .ومع ذلك، فإن ORM الخاص بـ Django لا يدعم هذا محليًا ويجب عليك استخدام استعلام SQL أولي (انظر توثيق).أعتقد أن هذا قد يكون الخيار الأفضل، ولكن مرة أخرى - فقط إذا رأيت بالفعل مشكلة حقيقية في الأداء.

نصائح أخرى

وضغط وربما الأكثر فعالية:

for index, item in enumerate(your_queryset):
    ...

إذا كنت ترغب فقط أن تعرف أين كنت تعترض يجلس بين كل الآخرين (على سبيل المثال عند تحديد رتبة)، يمكنك أن تفعل ذلك بسرعة عن طريق عد الكائنات قبل:

    index = MyModel.objects.filter(sortField__lt = myObject.sortField).count()

وعلى افتراض لغرض التوضيح أن النماذج الخاصة بك قياسية مع id مفتاح أساسي، ثم تقييم

list(qs.values_list('id', flat=True)).index(obj.id)

وسوف تجد مؤشر obj في qs. في حين أن استخدام list بتقييم مجموعة طلبات البحث، فالتقييم ليس مجموعة طلبات البحث الأصلي ولكن مجموعة طلبات البحث مشتقة. يعمل هذا التقييم استعلام SQL إلى الحصول على حقول معرف فقط، وليس إضاعة الوقت في جلب غيرها من المجالات.

ويمكنك القيام بذلك باستخدام <لأ href = "https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra" يختلط = "نوفولو "> queryset.extra(…) و بعض SQL الخام مثل ذلك:

queryset = queryset.order_by("id")
record500 = queryset[500]

numbered_qs = queryset.extra(select={
    'queryset_row_number': 'ROW_NUMBER() OVER (ORDER BY "id")'
})

from django.db import connection
cursor = connection.cursor()
cursor.execute(
    "WITH OrderedQueryset AS (" + str(numbered_qs.query) + ") "
    "SELECT queryset_row_number FROM OrderedQueryset WHERE id = %s",
    [record500.id]
    )
index = cursor.fetchall()[0][0]

index == 501 # because row_number() is 1 indexed not 0 indexed

ومن الممكن عن وسيلة بسيطة لpythonic الاستعلام مؤشر عنصر في مجموعة طلبات البحث:

(*qs,).index(instance)

وهذا الجواب سوف فك ومجموعة طلبات البحث في قائمة، ثم استخدم يحمل في ثناياه عوامل وظيفة مؤشر بيثون لتحديد انها الموقف.

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