2012-03-04 9 views
10

Estoy usando South con Django para las migraciones de bases de datos.La migración de Django South no funciona con null = True and blank = True

En mi models.py me cambió uno de los campos de

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

a

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

En otras palabras, quería hacer que el campo group para User opcional.

Luego, cuando he intentado ejecutar un schemamigration, Sur me dio este error

(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: 

Por qué se queja del Sur? ¿No especifiqué un valor predeterminado de NULL con null = True y blank = True?

En caso de que esto es lo que importa mi tabla actual se parece a 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 

Y la declaración 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

Pasé por alto el problema seleccionando la opción # 3, pero aún me gustaría saber por qué South se quejaba ... – hobbes3

+0

Solo un comentario sobre su código, no es bueno tener espacios entre corchetes, excepto después de una coma. No es necesario, pero está en los estándares de estilo python, y es mejor para la legibilidad. – tushar747

+0

@ tushar747 Sí, este es el código antiguo. Ya no escribo así. He actualizado el estilo. ¡Gracias! – hobbes3

Respuesta

11

Creo ... del Sur está pensando en caso de que quería deshacer su migración a cuando tenía

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

En este caso, ¿cuál sería el valor predeterminado si se revierte? Elegiste la opción n. ° 3, que creo que deshabilita la posibilidad de retrotraerse a esa migración, lo que soluciona tu problema de esa manera.

+0

Hmm, eso tiene sentido ... Pero creo que South solo debería advertir si cambio la (posible) clave externa NULL a NOT NULL foránea. ¿Además de cómo se supone que tienes un valor predeterminado para una clave externa de todos modos? Elija una identificación aleatoria? – hobbes3

+1

Tiene razón. A menudo me he preguntado cómo debería elegir un valor por defecto para un FK. He tenido muchos problemas, a veces tengo que volver a hacer mis datos debido a eso. Primero creé un elemento en la tabla FK y luego ejecuté mi migración de manera predeterminada si fuera necesario. Estoy seguro de que no es la mejor manera. – darren

Cuestiones relacionadas