2015-01-24 11 views
9

Sütunlarda varsayılan değer yalnızca ORM katmanında olduğu gibi görünüyor ve aslında DB'de varsayılan bir değer ayarlamıyor. Aynı zamanda, ID anahtarının, veritabanında bunu yapmak mümkün olduğunu söyleyen bir varsayılan değiştirici vardır, ancak nasıl emin değil?Django 1.7.3/postgres geçişlerini kullanarak db'deki varsayılan sütun değeri nasıl ayarlanır?

örnek kod: göç sahip olmanın bir yolu created_at Değiştiricilerdeki default current_timestamp set var mı

Column |   Type   |       Modifiers       
------------+--------------------------+------------------------------------------------------------- 
id   | integer     | not null default nextval('myapp_host_id_seq'::regclass) 
name  | character varying(255) | not null 
created_at | timestamp with time zone | not null 

:

class Host(models.Model): 
    name = models.CharField(max_length=255, null=False) 
    created_at = models.DateTimeField(default=datetime.now, blank=True) 

şu tablo oluşturur? Değilse, ham SQL geçişlerine geçmek için bir yol var mı? Buna ihtiyacım var çünkü veritabanı, uygulama katmanında varsayılan değerler gibi şeyleri uygulamak zorunda kalmak istemediğim diğer işlemler (ör. Toplu işlemler) tarafından kullanılıyor.

+0

"models.Migration" uygulamasındaki uygulama yöntemini geçersiz kılmaya çalışıp ham sql çalıştırmasını sağlayın. RunSQL için – Isaac

cevap

8

ben gibi, bir RunSQL operation şey kodunuzu koyardı. API, tersine işlem için SQL'i eklemeyi kolaylaştırır ve geçiş altyapısı, RunSQL'un anlamını anladığı için daha iyi kararlar verebilecektir. (Örneğin, RunSQL işlemine sahip bir geçiş boyunca geçişleri ezmemeyi bilir.)

+0

+1. Ayrıca [state_operations parametresini kullanarak orijinal geçişi geçersiz kılma] özelliğini öneririm (http://pankrat.github.io/2015/django-migrations-without-downtimes/#default-values:29c4533310fb23be2fc88d399c969fd7) – Pankrat

0

Bu benim için çalıştı. Hala daha temiz çözümler olup olmadığını bilmek istiyorum: Ben bu yaklaşım apply() geçersiz çalışırken daha temiz olduğunu düşünüyorum

class Migration(migrations.Migration): 

dependencies = [ 
    ('myapp', 'previous_migration'), 
] 

operations = [ 
    migrations.RunSQL("alter table myapp_host alter column created_at set default current_timestamp"), 
] 

:

class Migration(migrations.Migration): 

dependencies = [ 
    ('myapp', 'previous_migration'), 
] 

operations = [] 

def apply(self, project_state, schema_editor, collect_sql=False): 
    cursor = connection.cursor() 
    cursor.execute("alter table myapp_host alter column created_at set default current_timestamp") 
    return super(Migration, self).apply(project_state, schema_editor, collect_sql) 
İlgili konular