نظرًا لأنه يتم تخزين DecimalField
كـ string
عند الفهرسة ، فإنه لا ينتج عنه النتائج المتوقعة عند استخدام order_by
.
بدلاً من الترتيب حسب القيمة العددية ، يقوم بدلاً من ذلك بفرز البيانات أبجديًا.
المشكلة ذات الصلة على الواجهة الخلفية Xapian هنا: https://github.com/notanumber/xapian-haystack/issues/84
ربما تكون أفضل طريقة لمعالجة هذا الأمر (بسرعة) هي تحديث وثائق 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')
؟ حق؟
التعليق الأكثر فائدة
حل واحد لهذا هو تخزين محتويات حقل عشري كعدد صحيح. على سبيل المثال ، إذا كان لدي نموذج يسمى MyModel مع حقل عشري يسمى السعر ، يمكنني ضربه في عدد المنازل العشرية وتخزينه كعدد صحيح.