2012-03-04 17 views
10

Veritabanı geçişleri için Django ile South kullanıyorum. Benim models.py yılındaDjango Güney geçiş null = True ve blank = true ile çalışmadı True

Ben opsiyonel User için group alanını yapmak istedim, başka deyişle

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

için

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

gelen alanlardan birini değiştirdi. Bir schemamigration çalıştırmaya uğraşırken

Ardından, Güney bana bu hatayı
(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: 

Neden Güney şikayet

verdi? null = True ve blank = True ile bir NULL varsayılan belirtmedim mi?

durumda bu benim şimdiki tablo için 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 

benziyor Ve geri almak istediğini düşünüyorum

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

Sorun # 3'ü seçerek sorunu atladım, ancak yine de South'un neden şikayet ettiğini bilmek isterim ... – hobbes3

+0

Kodunuzdaki bir yorum, virgülden sonra virgül dışında boşluk olması iyi değildir. Gerekli değil, ancak python stili standartlarında ve okunabilirliği daha iyi. – tushar747

+0

@ tushar747 Evet, bu eski bir kod. Artık böyle yazmam. Tarzını güncelledim. Teşekkürler! – hobbes3

cevap

11

... Güney durumunda düşünüyor SELECT beyanı nedir konularda

class User(models.Model): 
    group = models.ForeignKey(Group) 
öğelerinize geçişBu durumda, geri alındığında varsayılan değer ne olmalıdır. Bu geçişe geri dönme özelliğini devre dışı bıraktığını ve böylece sorununuzu bu şekilde düzelttiğime inandığım # numaralı seçeneği tercih ettiniz.

+0

Hmm bu tür bir mantık ... Ama sanırım Güney (sadece) NULL yabancı anahtarını NULL yabancı anahtarına geri değiştirirsem uyar. Yine de nasıl yabancı bir anahtar için varsayılan bir varsayım var? Rastgele bir id seçin? – hobbes3

+1

Siz haklısınız. Sıklıkla FK için nasıl bir varsayılan seçmem gerektiğini merak ettim. Çok fazla sorun yaşadım, bazen de bunun yüzünden verilerimi yeniden yapmak zorunda kaldım. FK tablosunda ilk önce bir öğe oluşturdum, sonra gerekiyorsa geçişimi varsayılan olarak çalıştırıyorum. Eminim ki en iyi yol değil. – darren