---
slug: "alpine-linux-decimal-field-quantize-failed"
title: "Alpine linux で Django の DecimalField の quantize に失敗した場合"
description: "PyCharm / JetBrains 製エディタで、プロジェクトビューのフォルダ内ファイルがシングルクリックで開かないように設定する方法。"
url: "https://www.ytyng.com/blog/alpine-linux-decimal-field-quantize-failed"
publish_date: "2019-06-22T13:07:19Z"
created: "2019-06-22T13:07:19Z"
updated: "2026-05-11T13:21:51.077Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/6497da9f8aa44c8390c979949901a0e3.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Alpine linux で Django の DecimalField の quantize に失敗した場合

<p>Alpine の Docker 環境で、Django Cartridge のテストに失敗していた</p>
<pre>  File "/var/src/venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 958, in prepare_value<br />    value = field.get_db_prep_save(value, connection=self.connection)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/models/fields/<span>__</span>init<span>__</span>.py", line 1612, in get_db_prep_save<br />    self.max_digits, self.decimal_places)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/backends/base/operations.py", line 493, in adapt_decimalfield_value<br />    return utils.format_number(value, max_digits, decimal_places)<br />  File "/var/src/venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 200, in format_number<br />    value = value.quantize(decimal.Decimal(".1") ** decimal_places, context=context)<br />decimal.InvalidOperation: <span>[&lt;class 'decimal.InvalidOperation'&gt;]<br /></span><span></span></pre>
<pre>InvalidOperation: <span>[&lt;class 'decimal.InvalidOperation'&gt;]<br /></span><span></span></pre>
<p><span><br /></span>が出ていた。<br /><br />調査すると<br /><br />decimal_places が 127 になってた。<br /><br />(別のテスト環境だと0で、テストが成功していた)<br /><br />decimal_places は、<br /><br /></p>
<pre>./manage.py shell<br /><br />from locale import localeconv; localeconv()</pre>
<pre>{'currency_symbol': '&yen;',<br /> 'decimal_point': '.',<br /> 'frac_digits': 0,<br /> 'grouping': [],<br /> 'int_curr_symbol': 'JPY ',<br /> 'int_frac_digits': 0,<br /> 'mon_decimal_point': '.',<br /> 'mon_grouping': <span>[3, 3, 0]</span>,<br /> 'mon_thousands_sep': ',',<br /> 'n_cs_precedes': 1,<br /> 'n_sep_by_space': 0,<br /> 'n_sign_posn': 4,<br /> 'negative_sign': '-',<br /> 'p_cs_precedes': 1,<br /> 'p_sep_by_space': 0,<br /> 'p_sign_posn': 1,<br /> 'positive_sign': '',<br /> 'thousands_sep': ''}</pre>
<p>この、frac_digits が使われる。<br /><br /> テストが失敗する環境だと<br /><br /></p>
<pre> {'currency_symbol': '',<br /> 'decimal_point': '.',<br /> 'frac_digits': 127,<br /> 'grouping': [],<br /> 'int_curr_symbol': '',<br /> 'int_frac_digits': 127,<br /> 'mon_decimal_point': '',<br /> 'mon_grouping': [],<br /> 'mon_thousands_sep': '',<br /> 'n_cs_precedes': 127,<br /> 'n_sep_by_space': 127,<br /> 'n_sign_posn': 127,<br /> 'negative_sign': '',<br /> 'p_cs_precedes': 127,<br /> 'p_sep_by_space': 127,<br /> 'p_sign_posn': 127,<br /> 'positive_sign': '',<br /> 'thousands_sep': ''}</pre>
<p><br />となっている。ロケールが足りないっぽい。<br /><br /><br /><br />Dockerfile をこのように書いて、ロケール musl-locales を作ってみたが<br /><br /></p>
<pre>ENV MUSL_LOCPATH="/usr/share/i18n/locales/musl"<br /><br />RUN apk --no-cache add libintl &amp;&amp; \<br />   apk --no-cache --virtual .locale_build add cmake make musl-dev gcc gettext-dev git &amp;&amp; \<br />   git clone https://gitlab.com/ytyng/musl-locales &amp;&amp; \<br />   cd musl-locales &amp;&amp; cmake -DLOCALE_PROFILE=OFF -DCMAKE_INSTALL_PREFIX:PATH=/usr . &amp;&amp; make &amp;&amp; make install &amp;&amp; \<br />   cd .. &amp;&amp; rm -r musl-locales &amp;&amp; \<br />   apk del .locale_build</pre>
<p><br />それでも int_frac_digits は変更されなかった。<br /><br />方法がわからなかったので、<br />django の settings で<br /><br /></p>
<pre>setattr(locale, '_override_localeconv',<br />        {'currency_symbol': '&yen;',<br />         'decimal_point': '.',<br />         'frac_digits': 0,<br />         'grouping': [],<br />         'int_curr_symbol': 'JPY ',<br />         'int_frac_digits': 0,<br />         'mon_decimal_point': '.',<br />         'mon_grouping': <span>[3, 3, 0]</span>,<br />         'mon_thousands_sep': ',',<br />         'n_cs_precedes': 1,<br />         'n_sep_by_space': 0,<br />         'n_sign_posn': 4,<br />         'negative_sign': '-',<br />         'p_cs_precedes': 1,<br />         'p_sep_by_space': 0,<br />         'p_sign_posn': 1,<br />         'positive_sign': '',<br />         'thousands_sep': ''})</pre>
<p><br />こんな感じで、locale._override_localeconv をパッチすると、テストが通るようになった。</p>
<p></p>
<p>ロケールが絡む環境では、Alpine Linux より Debian などを使ったほうがいいかもしれない。</p>
