2012-03-04 109 views
10

我正在使用South与Django进行数据库迁移。Django South迁移不适用于null = True且空白= True

在我models.py我改变的一个字段从

class User(models.Model): 
    group = models.ForeignKey(Group) 

class User(models.Model): 
    group = models.ForeignKey(Group, null = True, blank = True) 

换句话说,我想使group领域User可选。

然后,当我试图运行一个schemamigration,南给了我这个错误

(doors)[email protected]:~/Sites/mysite$ python manage.py schemamigration doors --auto 
? The field 'User.group' does not have a default specified, yet is NOT NULL. 
? Since you are making this field nullable, you MUST specify a default 
? value to use for existing rows. Would you like to: 
? 1. Quit now, and add a default to the field in models.py 
? 2. Specify a one-off value to use for existing columns now 
? 3. Disable the backwards migration by raising an exception. 
? Please select a choice: 

为什么南抱怨?我没有在null = Trueblank = True中指定NULL的默认值吗?

如果它的事项,这是什么我现在的表看起来像doors_user

mysite=# \d doors_user 
            Table "public.doors_user" 
    Column |   Type   |      Modifiers       
-------------+--------------------------+--------------------------------------------------------- 
id   | integer     | not null default nextval('doors_user_id_seq'::regclass) 
group_id | integer     | not null 
user_type | character varying(1)  | not null default 't'::character varying 
comment  | text      | not null 
email  | character varying(75) | not null 
password | character varying(135) | not null 
first_name | character varying(135) | not null 
last_name | character varying(135) | not null 
phone  | character varying(135) | not null 
status  | character varying(1)  | not null default 'p'::character varying 
location_id | integer     | 
t_created | timestamp with time zone | not null 
t_modified | timestamp with time zone | not null 
Indexes: 
    "doors_user_pkey" PRIMARY KEY, btree (id) 
    "doors_user_group_id" btree (group_id) 
    "doors_user_location_id" btree (location_id) 
Foreign-key constraints: 
    "group_id_refs_id_2fde5e861cc0e5fe" FOREIGN KEY (group_id) REFERENCES doors_group(id) DEFERRABLE INITIALLY DEFERRED 
    "location_id_refs_id_13c85dcc5cba5e23" FOREIGN KEY (location_id) REFERENCES doors_location(id) DEFERRABLE INITIALLY DEFERRED 
Referenced by: 
    TABLE "doors_property" CONSTRAINT "owner_id_refs_id_7a3a10af3eba8739" FOREIGN KEY (owner_id) REFERENCES doors_user(id) DEFERRABLE INITIALLY DEFERRED 
    TABLE "doors_order" CONSTRAINT "user_action_id_refs_id_79506d7c5228f713" FOREIGN KEY (user_action_id) REFERENCES doors_user(id) DEFERRABLE INITIALLY DEFERRED 
    TABLE "doors_order" CONSTRAINT "user_created_id_refs_id_79506d7c5228f713" FOREIGN KEY (user_created_id) REFERENCES doors_user(id) DEFERRABLE INITIALLY DEFERRED 
    TABLE "doors_log" CONSTRAINT "user_id_refs_id_3ce582a126688737" FOREIGN KEY (user_id) REFERENCES doors_user(id) DEFERRABLE INITIALLY DEFERRED 
    TABLE "doors_ordercomment" CONSTRAINT "user_id_refs_id_6d10d6e79572e14d" FOREIGN KEY (user_id) REFERENCES doors_user(id) DEFERRABLE INITIALLY DEFERRED 

而且SELECT声明

mysite=# select * from doors_user; 
id | group_id | user_type | comment |  email  | password | first_name | last_name | phone | status | location_id |   t_created   |   t_modified   
----+----------+-----------+---------+------------------+----------+------------+-----------+-------+--------+-------------+------------------------------+------------------------------- 
    1 |  1 | w   |   | [email protected] | ads  | Michael | Anderson |  | a  |    | 2012-03-04 06:44:44.97263-05 | 2012-03-04 06:44:44.972661-05 
(1 row) 
+0

我通过选择选项#3绕过了这个问题,但我仍然想知道为什么南方抱怨... – hobbes3 2012-03-04 18:39:54

+0

只需对您的代码发表评论,除逗号之外,在括号内有空格并不好。不是必需的,但它符合Python风格标准,并且更易于阅读。 – tushar747 2014-01-06 14:15:43

+0

@ tushar747是的,这是旧代码。我不再那样写了。我更新了风格。谢谢! – hobbes3 2014-01-07 01:06:47

回答

11

我想......南都的情况下,想你想回滚你的迁移到你有的时候

class User(models.Model): 
    group = models.ForeignKey(Group) 

在这种情况下,如果回滚它,默认值必须是什么。您选择了选项#3,我相信这会禁用回滚到该迁移的能力,从而以这种方式解决您的问题。

+0

嗯那种有道理......但我认为如果我将(可以是)NULL外键更改回NOT NULL外键,South应该只会发出警告。除此之外,你认为无论如何都有一个外键的默认值?选择一个随机ID? – hobbes3 2012-03-05 01:33:13

+1

你是对的。我经常想知道如何为FK选择默认值。我遇到了很多麻烦,有时不得不重做我的数据。我首先在FK表中创建了一个项目,然后如果需要的话,我使用默认值运行我的迁移。我相信这不是最好的方式。 – darren 2012-03-05 08:42:34

相关问题