سؤال

مرحبا، أريد فرز الكائنات بناء على قيمة محسوبة في Django ... كيف أفعل ذلك؟

فيما يلي نموذج ملف تعريف المستخدم على ذلك بناء على تجاوز سعة مكدس يفسر مأزق:

class Profile(models.Model):
    user = models.ForeignKey(User)

    def get_reputation():
        ... 
        return reputation
    reputation = property(get_reputation)

لذلك، أقول أريد فرز المستخدمين حسب السمعة. كيف يمكنني فعل ذلك؟ أعلم أنك لا تستطيع القيام بذلك فقط:

Profile.objects.order_by("-reputation")

شكرا لمساعدتك الجميع :)

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

المحلول

إذا كنت بحاجة إلى القيام بالفرز في قاعدة البيانات (نظرا لأن لديك الكثير من السجلات، وتحتاج إلى مثل المخفف منها)، فإن الخيار الحقيقي الوحيد هو تحويل السمعة إلى حقل ضعيف (على سبيل المثال تحديثه في عملية تجاوز save() طريقة على النموذج).

نصائح أخرى

نظرا لأن رمز الحساب الخاص بك موجود فقط داخل Python، فعليك إجراء الفرز في Python أيضا:

sorted (Profile.objects.all (), key = lambda p: p.reputation)

اعتبارا من django-1.8، فمن الممكن فرز queryset باستخدام تعبيرات الاستعلام طالما يمكن تقديم القيمة المحسوبة في SQL. تستطيع ايضا استخذام annotations إلى النموذج كما order_by مصطلح.

from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")

العمليات الأساسية مثل +, -, *, / و ** يمكن استخدامها مع F(). وبعد بالإضافة إلى هناك العديد من الوظائف الأخرى مثل Count, Avg, Max, ...

الروابط:

انظر أيضا هذا حتى سؤال وجواب: طلب استعلام عن طريق قيمة الحقل الإجمالية

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