Django-haystack: لا يعمل "order_by" مع "DecimalField"

تم إنشاؤها على ٩ أغسطس ٢٠١١  ·  12تعليقات  ·  مصدر: django-haystack/django-haystack

نظرًا لأنه يتم تخزين DecimalField كـ string عند الفهرسة ، فإنه لا ينتج عنه النتائج المتوقعة عند استخدام order_by .

بدلاً من الترتيب حسب القيمة العددية ، يقوم بدلاً من ذلك بفرز البيانات أبجديًا.

المشكلة ذات الصلة على الواجهة الخلفية Xapian هنا: https://github.com/notanumber/xapian-haystack/issues/84

needs review

التعليق الأكثر فائدة

حل واحد لهذا هو تخزين محتويات حقل عشري كعدد صحيح. على سبيل المثال ، إذا كان لدي نموذج يسمى MyModel مع حقل عشري يسمى السعر ، يمكنني ضربه في عدد المنازل العشرية وتخزينه كعدد صحيح.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

ال 12 كومينتر

ربما تكون أفضل طريقة لمعالجة هذا الأمر (بسرعة) هي تحديث وثائق DecimalField للإشارة إلى أن order_by غير مدعوم.

على المدى الطويل ، يمكن إخراج رسالة WARNING من سجل leve عند محاولة تنفيذ العملية order_by على DecimalField . لأسباب تتعلق بالأداء ، لا يمكن التحقق من نوع الحقل إلا عندما يكون الموقع في وضع DEBUG .

حل واحد لهذا هو تخزين محتويات حقل عشري كعدد صحيح. على سبيل المثال ، إذا كان لدي نموذج يسمى MyModel مع حقل عشري يسمى السعر ، يمكنني ضربه في عدد المنازل العشرية وتخزينه كعدد صحيح.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

يبدو أن هذا يعمل مع elasticsearch ولكن ليس من أجل solr.

يبدو أن الخطأ ينطبق على Whoosh أيضًا.

تفشل استعلامات النطاق أيضًا في البحث المرن.

+1

لقد واجهت نفس المشكلة باستخدام SolrBackend. نحن نقوم بالفرز حسب حقل يحتوي على رقم يتراوح بين 0.0 و 1.0 يمثل خوارزمية تسجيل معقدة. عند الفرز حسب السلسلة التي تعني أن العناصر ذات النقاط الصغيرة جدًا يتم فرزها فوق العناصر ذات الدرجات الأكبر مثل 9e-08

إلى حد ما ، الحل الواضح هو استخدام حقل عائم بدلاً من ذلك (لا يهم حقًا لأغراضي).

هذا سيء جدا. إذا لم يتم إصلاحه ، ولكن تم توثيقه فقط على أنه "order_by لا يعمل" ، فأعتقد أنه يجب علينا إهمال نوع الحقل أو أن يكون لدينا تحذير واضح في قائمة أنواع الحقول ، لأنه سيكون من السهل استخدامه عن طريق خطأ ، وبطء الإصلاح إذا كان لديك قاعدة بيانات كبيرة.

لا يعمل أيضًا من أجل elasticsearch

: +1:

JoeJasinski شكرا جزيلا لك ، إجابتك ساعدتني

حل واحد لهذا هو تخزين محتويات حقل عشري كعدد صحيح. على سبيل المثال ، إذا كان لدي نموذج يسمى MyModel مع حقل عشري يسمى السعر ، يمكنني ضربه في عدد المنازل العشرية وتخزينه كعدد صحيح.

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

وثم؟
MyIndex.objects.all().order_by('prepare_price') ؟ حق؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات