1

我想通过 Django 在数据库中保存电话号码(美国)。我有

from django.db import models
    class Number(models.Model):
        phone_number = models.CharField("Phone Number", max_length=10, unique=True)

当我跑的时候:

python manage.py sql myapp

我有

BEGIN;
CREATE TABLE `demo_number` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`phone_number` varchar(10) NOT NULL UNIQUE
)
;

当我验证它时,没有错误。

python manage.py validate
0 errors found

所以我做了

python manage.py syncdb

在 MySQL 控制台中,我看到:

mysql> select * from myapp_number;
Empty set (0.00 sec)
mysql> describe myapp_number;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| phone_number | varchar(10) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+

2 行(0.03 秒)`

然后在python manage.py shell,我做

from demo.models import Message, Number, Relationship, SmsLog
n=Number(phone_number='1234567890')
n.save()

当我再次检查 MySQL 控制台时,我看到:

mysql> select * from myapp_number;
+------------+--------------+
| id | phone_number |
+------------+--------------+
| 2147483647 | 1234567890 |
+------------+--------------+
1 row in set (0.01 sec) 

为什么是id一个大数字?事实上,正因为如此,我不能再插入电话号码了。例如,在python manage.py shell

n=Number(phone_number='0987654321')
n.save()

IntegrityError: (1062, "Duplicate entry '2147483647' for key 'PRIMARY'")

我是 Django 新手(使用 Django 1.5 和 MySQL 服务器版本:5.1.63)。如果有人能指出我所犯的明显错误,我将不胜感激。附带说明一下,如果我想将 15 扩展max_lengthCharField15,那么实现这一目标的最简单和最干净(即不搞砸现有设置)的方法是什么?谢谢你。

4

2 回答 2

0

我在您的代码中看不到任何错误。如果表中没有任何数据,我会尝试删除demo_number表并再次运行 syncdb。

如果表中没有任何数据,更改最大长度 15 的最简单方法是更改​​模型,将表放入 db shell 中,然后再次运行 syncdb。

如果表中确实有数据,则可以更改模型,然后更新数据库中的列。在您的情况下(特定于 MySQL):

ALTER TABLE demo_number CHANGE phone_number phone_number varchar(15) NOT NULL UNIQUE;

对于 Django 中更复杂的迁移,请使用South

于 2013-06-20T22:24:39.390 回答
0

事实证明@Alasdair 是对的。我不得不重置应用程序。如果有人想知道如何做(我在 StackOverflow 中搜索过,但由于它相关,不妨在这里发布),这个https://stackoverflow.com/a/15444900/1330974将适用于 Django >1.3。

我的后续问题是AutoField ID 是否在发生错误时增加。例如,我在 shell 中这样做:

from demo.models import Number
n=Number(phone_number='1234567890')
n.save()
n=Number(phone_number='1234567890')
n.save()

得到了IntegrityError预期。所以尝试一个新号码:

n=Number(phone_number='0987654321')
n.save()

现在,当我检查 MySQL 控制台时,我看到:

mysql> select * from demo_number;
+----+--------------+
| id | phone_number |
+----+--------------+
| 3 | 0987654321 |
| 1 | 1234567890 |
+----+--------------+
2 rows in set (0.00 sec) 

AutoField如果出现错误,Django 跳过 ID 是否正常?谢谢你。

于 2013-06-21T00:00:15.550 回答