2011-05-27 15 views
19

için varsayılan değer ben Django modeli kodu vardır:Django modelleri: sütununda

status = models.PositiveIntegerField(default = 0b000) 
comments_allowed = models.BooleanField(default = True) # whether comments are allowed to this post 

Ama bu

`status` integer NOT NULL default '4', 
`comments_allowed` bool NOT NULL default TRUE 
olmuyor

ve benzeri SQL üretecek beklenen ben manage.py sqlall appname çalıştırdığınızda üretilir:

`status` integer UNSIGNED NOT NULL, 
`comments_allowed` bool NOT NULL 

'e girme's kod ve googling bana hiçbir şey vermedi, ama James Bennet'in'un SQL' u oluşturmayı etkilemediği ancak Django admin için gerekli olduğu yorumunda bulunmadı. Öyle olsa bile, istenen etkiyi nasıl kazanırım? https://docs.djangoproject.com/en/dev/ref/models/fields/#default:

Benim Django versiyonu default parametresi de bir çağrılabilir nesneyi alabilir 1.3.0 Final

+0

default' da çağrılabilir nesneleri olur atanabilir 'gerçeğini sadece göçün db.create_table sonra bazı ek SQL yürütebilirsiniz Modelin oluşturulmasında esas olarak kullanıldığını belirtir. SQL ALTER komutunu manuel olarak çalıştırmanın yanı sıra, AFAIK istediğiniz şeyi yapmak mümkün değildir. –

+0

Teşekkürler, Shawn. Bu cevabı bekledim çünkü benim googlingim sonuç getirmedi. – Nemoden

+3

İlgili bilet: https://code.djangoproject.com/ticket/470 – Medorator

cevap

14

Not olduğunu. Bu kesinlikle SQL'de yeniden üretilemeyen bir davranış! Bu yüzden Django'nun olası her durum için SQL üretmesi mümkün olmaz. Basitlik ve tutarlılık uğruna her durumda SQL üretmemeyi seçtikleri anlaşılıyor.

Bul::

if f.primary_key: 
    field_output.append(style.SQL_KEYWORD('PRIMARY KEY')) 
elif f.unique: 
    field_output.append(style.SQL_KEYWORD('UNIQUE')) 

eklenti sonra:

if(f.default != models.fields.NOT_PROVIDED): 
    field_output.append(style.SQL_KEYWORD('DEFAULT ' + str(f.default))) 

(Kaynak

+3

Bu, SQL'de en yararlı şeylerden biridir - sütun oluştururken varsayılan bir değer sağlamak. Django' için çok kötü :( – Nemoden

+0

@Nemoden her zaman SQL'inizi manuel olarak değiştirebilirsiniz.Django bunu daha esnek hale getirmek için bunu ekledi. Django ve Python'daki birçok şeyde olduğu gibi, beğenmediyseniz bunu değiştirebilirsiniz! – NickAldwin

+7

Tabii ki, evet ... Ama ... Sadece hayal kırıklığına uğradım. Kutudan çıkarması zor değil, değil mi? :) Eğer callable sütun ifadesi oluşturmak için varsayılan değer ekle… 'Ve gerçekten kafa karıştırıcı, 'Django' çaylak olarak düşündüğünüz gibi 'Tamam, iyi ... Burada varsayılan bir seçeneğimiz var, bu yüzden bazı varsayılan değerler sağlayalım' ve hiçbir şey yapmıyor ... Ve ilk düşündük ki "Vay, Django modelleri çok cool "ve şimdi hepiniz" Wheee .... onlar bu kadar havalı değiller ":) THAT tamam, aslında. Şimdi sadece üzgünüm :) – Nemoden

9

tek kalıcı çözüm, özellikle/arka uçları/creation.py db Django kaynağını yama geçerli: http://www.supermind.org/blog/671/django-not-setting-default-column-value-in-mysql)

Alternatif olarak (ve tercihen), eğer Güney kullanıyorsanız,

MySQL:

db.execute("ALTER TABLE yourapp_yourmodel MODIFY status int Default '4'") 

Postgres:

db.execute("ALTER TABLE yourapp_yourmodel ALTER COLUMN status SET DEFAULT 4") 

+0

Tam olarak!Ben sadece bu konuda üzülen kim değil :) Çözüm için teşekkür ederiz. Kirli-kirli-kirli-hack olduğu gibi kabul edemem. Bu yüzden şimdi "ben alter tablo mytable değiştir sütun durumu bool değil varsayılan DOĞRU 'ile gideceğim. – Nemoden

+1

Ummm ... Ben de cevabında çok dedim, ve otomatik olarak eklemek için Güney kullanarak gibi bir alternatif araçlar bulmak tavsiye sütun, çünkü kaynağı yamalamak iyi bir fikir değildir. Hangisi Güney ya da el ile yapmak istediğinizi tam olarak gösteriyor. –

+0

Kafam karıştı ... Django'ya kimse yama gönderdi mi? – mlissner

İlgili konular