4

ここで何かを誤って構成したと確信していますが、それが何であるかはわかりません。

Django には、次のようなモデル フィールドがあります。

short_url_slug = AutoSlugField(slugify=short_url_slugify, populate_from=id, blank=False, unique=True)

South は (一見) 正しく移行を作成します。

'short_url_slug': ('autoslug.fields.AutoSlugField', [], {'unique_with': '()', 'max_length': '50', 'populate_from': 'None', 'blank': 'True'}),

私のPostgresql DBはUTF8です:

\l

(MyDBName)                      | (username) | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

そして、私は実際のユニコード文字を持っています:

u'\xa4'

しかし、これをDBに書き込んで読み出そうとすると、次のようになります。

In [3]: this_instance.short_url_slug
Out[3]: u'o'

考え?私の疑いでは、Postgresql には別の文字エンコーディングが必要ですが、それがどうあるべきか (もしそうなら)、またはそれを行う方法がわかりません。

追加情報で編集

SELECT version(), current_setting('standard_conforming_strings') AS scs;

PostgreSQL 9.2.4 on x86_64-apple-darwin11.4.2, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit | on

(END) 

Python バージョン:

Python 2.7.2 (default, Oct 11 2012, 20:14:37)

ジャンゴのバージョン:

In [2]: django.VERSION
Out[2]: (1, 5, 1, 'final', 0)

psycopg2:

$ pip freeze | grep psycopg2
psycopg2==2.5

postgresql からの生ログ:

LOG:  statement: UPDATE [...lots of stuff removed...] "short_url_slug" = 'o' [... rest of the stuff ...]

そのため、Postgresql にも到達していないようです。しかし、挿入の行で中断すると、変数には間違いなく unicode 値が含まれています。

(Pdb) response.short_url_slug
u'\xd6'

(これは Python での割り当ての後ですが、response.save() の前です)

その他の出力:

ユニコードが変更されていることを私が検出している方法は、データベースの一意性制約に違反していることです。これは、このコンテンツをモデルに出力する際に​​テストできます (制約をオフにして):

In [11]: all = Response.objects.all()

In [12]: all[0].short_url_slug
Out[12]: u'o'

In [13]: all[4].short_url_slug
Out[13]: u'o'

In [14]: all[4].short_url_slug == all[0].short_url_slug
Out[14]: True
4

1 に答える 1

2

Django slugify は unicode をサポートしていません。unicode-slugifyを使用する必要があります

(Django の 2 つのスクープhttp://django.2scoops.org/で読まれたとおり)

于 2013-07-28T12:19:03.247 に答える