Django-haystack: order_by Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с DecimalField

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 9 Π°Π²Π³. 2011  Β·  12ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: django-haystack/django-haystack

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ DecimalField сохраняСтся ΠΊΠ°ΠΊ string ΠΏΡ€ΠΈ индСксировании, ΠΎΠ½ Π½Π΅ Π΄Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ использовании order_by .

ВмСсто сортировки ΠΏΠΎ числовому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ.

Бвязанная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с бэкэндом Xapian здСсь: https://github.com/notanumber/xapian-haystack/issues/84

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Один ΠΈΠ· способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ содСрТимоС дСсятичного поля ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число. НапримСр, Ссли Ρƒ мСня Π΅ΡΡ‚ΡŒ модСль MyModel с ΠΏΠΎΠ»Π΅ΠΌ Decimal с ΠΈΠΌΠ΅Π½Π΅ΠΌ price, я ΠΌΠΎΠ³ Π±Ρ‹ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° количСство дСсятичных Π·Π½Π°ΠΊΠΎΠ² ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число.

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

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

ВсС 12 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠΈΠΉ способ (быстро) Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ - ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ DecimalField Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ order_by Π½Π΅ поддСрТиваСтся.

Π’ Π±ΠΎΠ»Π΅Π΅ долгосрочной пСрспСктивС сообщСниС ΠΆΡƒΡ€Π½Π°Π»Π° уровня WARNING ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ order_by Π½Π° DecimalField . По сообраТСниям ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° поля ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° сайт находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ DEBUG .

Один ΠΈΠ· способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ содСрТимоС дСсятичного поля ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число. НапримСр, Ссли Ρƒ мСня Π΅ΡΡ‚ΡŒ модСль MyModel с ΠΏΠΎΠ»Π΅ΠΌ Decimal с ΠΈΠΌΠ΅Π½Π΅ΠΌ price, я ΠΌΠΎΠ³ Π±Ρ‹ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° количСство дСсятичных Π·Π½Π°ΠΊΠΎΠ² ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число.

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

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

ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для elasticsearch, Π½ΠΎ Π½Π΅ для solr.

Ошибка, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, относится ΠΈ ΠΊ Whoosh.

Запросы Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° elasticsearch.

+1

Π― столкнулся с этой ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ SolrBackend. ΠœΡ‹ сортируСм ΠΏΠΎ полю, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит число ΠΎΡ‚ 0,0 Π΄ΠΎ 1,0, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ слоТный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΡ†Π΅Π½ΠΊΠΈ. ΠŸΡ€ΠΈ сортировкС ΠΏΠΎ строкС это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнты с ΠΎΡ‡Π΅Π½ΡŒ малСнькими Π±Π°Π»Π»Π°ΠΌΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π°Π΄ элСмСнтами с Π±ΠΎΠ»Π΅Π΅ высокими Π±Π°Π»Π»Π°ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 9e-08.

ЧСстно говоря, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ - вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой (Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния для ΠΌΠΎΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ).

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ. Если это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ исправлСно, Π° просто Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ Β«order_by Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Β», Ρ‚ΠΎΠ³Π΄Π°, я Π΄ΡƒΠΌΠ°ΡŽ, Π½Π°ΠΌ слСдуСт ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° поля ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² спискС Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅ΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ошибка ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ исправлСниС, Ссли Ρƒ вас большая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ….

Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ для elasticsearch

: +1:

@JoeJasinski большоС Π²Π°ΠΌ спасибо, ваш ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠ½Π΅ ΠΏΠΎΠΌΠΎΠ³

Один ΠΈΠ· способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ содСрТимоС дСсятичного поля ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число. НапримСр, Ссли Ρƒ мСня Π΅ΡΡ‚ΡŒ модСль MyModel с ΠΏΠΎΠ»Π΅ΠΌ Decimal с ΠΈΠΌΠ΅Π½Π΅ΠΌ price, я ΠΌΠΎΠ³ Π±Ρ‹ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° количСство дСсятичных Π·Π½Π°ΠΊΠΎΠ² ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число.

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 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ