2014-09-01 40 views
3

我想一個新列添加到現有表中的另一價值,但我想給它依賴於已有數據的默認值:Django的遷移/南:新列取默認值從相同的記錄

例如每個記錄都有一個start_date。現在我想添加一個open_until列,並且我想用它填充每個現有記錄的start_date的值。 (即將到來的記錄將可以選擇不同的值)

有沒有一種友好的方式來做到這一點?

+0

不是數據庫級別,請在forms.py中執行此操作。 – elmonkeylp 2014-09-01 16:33:02

+0

@elmonkeylp但這會如何定位所有以前的條目? – confused00 2014-09-01 16:49:41

+0

在數據庫中設置了默認值後,就已經完成了。 – elmonkeylp 2014-09-01 16:54:02

回答

-1

正如我回答你,在數據庫級別設置一個動態的默認值是沒有必要的,如果你是一個框架:)

最好的辦法,我認爲,是設置你列的值工作保存記錄前的視圖。

models.py

from django.db import models 

class MyModel(models.Model): 
    start_date = models.DateField(), 
    open_until = models.DateField(), 

forms.py 從django.forms進口的ModelForm

class MyForm(forms.ModelForm): 
    model = MyModel 

    fields = ('start_date') 

類視圖

from django.http import HttpResponse 
from django.views.generic import CreateView 
from .models import MyModel 


MyView(CreateView): 
    form_class = MyForm 

    def post(self, request, *args, **kwargs): 
     form = self.form_class(request.POST) 
     if form.is_valid(): 
      submitted_form = form.save(commit=False) 
      submitted_form.open_until = form.cleaned_data["start_date"] 
      submitted_form.save() 
      # return an HttpResponse here 

對於以前的條目,做一個視圖調用只需一次,然後遍歷所有記錄並保存新列的值umn根據訂單欄的值。

事情是這樣的:

from django.http import HttpResponse 

def set_open_until_values(request) 
    records = MyModel.objects.all() 
    for record in records: 
     record.open_until = record.start_date 
     record.save() 
    return HttpResponse("Done!!") 
+2

這是一堆黑客。 Op要求遷移舊數據,而不是如何處理新創建的記錄。數據遷移是正確的Djangoish做法。創建一次性視圖?爲什麼?如果你真的想避免數據遷移,比如說,你還在原型設計中,只需從CLI運行該功能,不需要構建視圖...... Hacky hacky hacky – 2016-07-01 09:40:33

11

你也可以做到這一點內南。唯一需要注意的是,你需要兩個步驟:

  1. 一個架構遷移,增加了open_until列

    from django.db import models 
    import datetime 
    
    class MyModel(models.Model): 
        start_date = models.DateField(), 
        open_until = models.DateField(default=datetime.date.today), 
    

    $ python manage.py schemamigration --auto appname

  2. 一個數據遷移,填補現有具有該列值的行

    $ python manage.py datamigration appname populate_open_until

    import datetime 
    
    class Migration(DataMigration): 
    
        def forwards(self, orm): 
         "Set open_until value to that of start_date for existing rows" 
         for t in orm.MyModel.objects.all(): 
          t.open_until = t.start_date 
          t.save() 
    
        def backwards(self, orm): 
         "Revert back to default" 
         for t in orm.MyModel.objects.all(): 
          t.open_until = datetime.date.today 
          t.save() 
    

可選)在步驟1中,你可以提供一個臨時的默認值,或使其可選的,並且增加一個第三步驟

  • A 模式遷移,它使open_until列成爲強制性的。