Миграция Django South не работает с нулевым значением = True и пустым = True

Я использую South с Django для миграции базы данных.

В моем models.py я изменил одно из полей с

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

to

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

Другими словами, я хотел сделать поле group для User необязательным.

Затем, когда я попытался запустить схему миграции, Юг выдал мне эту ошибку.

(doors)hobbes3@hobbes3:~/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 с null = True и blank = True?

Если это имеет значение, вот как выглядит моя текущая таблица для 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)

person hobbes3    schedule 04.03.2012    source источник
comment
Я обошел проблему, выбрав вариант № 3, но мне все же хотелось бы знать, почему Юг жаловался...   -  person hobbes3    schedule 04.03.2012
comment
Просто комментарий к вашему коду, нехорошо иметь пробелы в скобках, кроме как после запятой. Не обязательно, но это соответствует стандартам стиля Python и лучше для удобочитаемости.   -  person tushar747    schedule 06.01.2014
comment
@ tushar747 Да, это старый код. Я так больше не пишу. Я обновил стиль. Спасибо!   -  person hobbes3    schedule 07.01.2014


Ответы (1)


Я думаю... Юг думает на случай, если вы захотите откатить свою миграцию до того момента, когда у вас был

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

В этом случае каким должно быть значение по умолчанию, если оно было отброшено. Вы выбрали вариант № 3, который, я считаю, отключает возможность отката к этой миграции, тем самым решая вашу проблему таким образом.

person darren    schedule 04.03.2012
comment
Хм, в этом есть смысл ... Но я думаю, что Юг должен предупреждать только в том случае, если я изменю (может быть) внешний ключ NULL обратно на внешний ключ NOT NULL. Помимо того, как вы предполагаете иметь значение по умолчанию для внешнего ключа? Выбрать случайный идентификатор? - person hobbes3; 05.03.2012
comment
Ты прав. Я часто задавался вопросом, как мне выбрать значение по умолчанию для FK. У меня было много проблем, иногда из-за этого мне приходилось переделывать свои данные. Сначала я создал элемент в таблице FK, а затем при необходимости запускаю миграцию по умолчанию. Хотя я уверен, что это не лучший способ. - person darren; 05.03.2012