Django-haystack: `order_by` `DecimalField` рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЕрдЧре░ 2011  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: django-haystack/django-haystack

рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдХреНрд░рдордг рдХрд░рддреЗ рд╕рдордп DecimalField рдХреЛ string рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ order_by рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдбреЗрдЯрд╛ рдХреЛ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред

Xapian рдмреИрдХрдПрдВрдб рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдБ: https://github.com/notannumber/xapian-haystack/issues/84

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рджрд╢рдорд▓рд╡ рдлрд╝реАрд▓реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ MyModel рдирд╛рдордХ рдПрдХ рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рджрд╢рдорд▓рд╡ рдлрд╝реАрд▓реНрдб рдореВрд▓реНрдп рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

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

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╢рд╛рдпрдж рдЗрд╕реЗ (рдЬрд▓реНрджреА рд╕реЗ) рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ DecimalField рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ order_by рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ, order_by рдСрдкрд░реЗрд╢рди рдХреЛ DecimalField рдкрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд▓реЗрд╡ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕рд╛рдЗрдЯ DEBUG рдореЛрдб рдореЗрдВ рд╣реЛред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рджрд╢рдорд▓рд╡ рдлрд╝реАрд▓реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ MyModel рдирд╛рдордХ рдПрдХ рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рджрд╢рдорд▓рд╡ рдлрд╝реАрд▓реНрдб рдореВрд▓реНрдп рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЪрджрд╛рд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдмрдЧ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд╣реВрд╢ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдкрд░ рд░реЗрдВрдЬ рдХреНрд╡реЗрд░реАрдЬрд╝ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

+1

рдореИрдВрдиреЗ рд╕реЛрд▓рд░рдмреИрдХрдПрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реА рдореБрджреНрджреЗ рдХреЛ рдорд╛рд░рд╛ рд╣реИред рд╣рдо рдПрдХ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╛рдБрдЯ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ 0.0 - 1.0 рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЬрдЯрд┐рд▓ рд╕реНрдХреЛрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕реНрдХреЛрд░ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдбрд╝реЗ рд╕реНрдХреЛрд░ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рд╕реЗ рдКрдкрд░ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ 9e-08

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдлреНрд▓реЛрдЯ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)ред

рдпрд╣ рдХрд╛рдлреА рдЦрд░рд╛рдм рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ "order_by рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдЧрд▓рддреА, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ рддреЛ рдорд░рдореНрдордд рдореЗрдВ рдзреАрдорд╛ред

рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

:+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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

SacNaturalFoods picture SacNaturalFoods  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

eromoe picture eromoe  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ajwillo picture ajwillo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hexstr1p picture hexstr1p  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jpatel3 picture jpatel3  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ