Python / Django将你的字符串写入Postgresql(使用UTF8 DB)和Munges Entry

我确定我在这里错误配置了一些东西,但我看不出它是什么.

在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 | 

我有一个现实生活中的unicode角色:

u'\xa4'

但是当我把它写到数据库中并尝试读出它时,我得到:

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)

Django版本:

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()之前)

更多输出:

我检测到unicode正在被攻击的方式是数据库唯一性约束被违反.这可以在将此内容输出到模型中时进行测试(约束关闭):

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

最佳答案 Django slugify不支持unicode,你应该使用
unicode-slugify

(正如两篇Django http://django.2scoops.org/中所读到的)

点赞