您的位置:首页 > 数据库 > SQL

在Django的Model中定义TextField字段导致无法在Mysql中生成表格

2013-05-30 13:30 746 查看
转自:/article/2971958.html

class Talk(models.Model):

time = models.DateTimeField()

content = models.TextField()

定义上面的Model后,使用manage.py syncdb一直无法看到表格生成的信息,当然mysql数据库中也的确没看到生成的表格。后来发现是TextField的问题,Mysql需要特殊的设置才能使用该字段,后来在Django的官方文档上看到了下面的一段话便豁然开朗:


TextField

class TextField ([ **options ] )

A large text field. The admin represents this as a <textarea> (a multi-line
input).

MySQL users

If you are using this field with MySQLdb 1.2.1p2 and the utf8_bin collation
(which is not the default), there are some issues to be aware of. Refer to the MySQL
database notes for details.

具体可见:http://docs.djangoproject.com/en/1.1/ref/models/fields/#textfield


TextField

class TextField([**options])

A large text field. The admin represents this as a <textarea> (a multi-line input).

MySQL users
If you are using this field with MySQLdb 1.2.1p2 and the utf8_bin collation
(which is not the default), there are some issues to be aware of. Refer to the MySQL
database notes for details.


Collation settings

The collation setting for a column controls the order in which data is sorted as well as what strings compare as equal. It can be set on a database-wide level and also per-table and per-column. This is documented
thoroughly in the MySQL documentation. In all cases, you set the collation by directly manipulating the database tables; Django doesn’t provide a way to set this on the model definition.

By default, with a UTF-8 database, MySQL will use the utf8_general_ci_swedish collation. This results in all string equality comparisons being
done in a case-insensitive manner. That is, "Fred" and "freD" are
considered equal at the database level. If you have a unique constraint on a field, it would be illegal to try to insert both "aa" and "AA" into
the same column, since they compare as equal (and, hence, non-unique) with the default collation.

In many cases, this default will not be a problem. However, if you really want case-sensitive comparisons on a particular column or table, you would change the column or table to use the utf8_bin collation.
The main thing to be aware of in this case is that if you are using MySQLdb 1.2.2, the database backend in Django will then return bytestrings (instead of unicode strings) for any character fields it returns receive from the database. This is a strong variation
from Django’s normal practice of always returning unicode strings. It is up to you, the developer, to handle the fact that you will receive bytestrings if you configure your table(s) to use utf8_bin collation.
Django itself should work smoothly with such columns, but if your code must be prepared to call django.utils.encoding.smart_unicode() at times
if it really wants to work with consistent data – Django will not do this for you (the database backend layer and the model population layer are separated internally so the database layer doesn’t know it needs to make this conversion in this one particular
case).

If you’re using MySQLdb 1.2.1p2, Django’s standard CharField class
will return unicode strings even with utf8_bin collation. However, TextField fields
will be returned as an array.array instance (from Python’s standard array module).
There isn’t a lot Django can do about that, since, again, the information needed to make the necessary conversions isn’t available when the data is read in from the database. This problem was fixed
in MySQLdb 1.2.2, so if you want to use TextField with utf8_bincollation,
upgrading to version 1.2.2 and then dealing with the bytestrings (which shouldn’t be too difficult) is the recommended solution.

Should you decide to use utf8_bin collation for some of your tables with MySQLdb 1.2.1p2, you should still useutf8_collation_ci_swedish (the
default) collation for the django.contrib.sessions.models.Session table (usually called django_session)
and the django.contrib.admin.models.LogEntry table (usually called django_admin_log).
Those are the two standard tables that useTextField internally.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: