我想一個新列添加到現有表中的另一價值,但我想給它依賴於已有數據的默認值:Django的遷移/南:新列取默認值從相同的記錄
例如每個記錄都有一個start_date
。現在我想添加一個open_until
列,並且我想用它填充每個現有記錄的start_date
的值。 (即將到來的記錄將可以選擇不同的值)
有沒有一種友好的方式來做到這一點?
我想一個新列添加到現有表中的另一價值,但我想給它依賴於已有數據的默認值:Django的遷移/南:新列取默認值從相同的記錄
例如每個記錄都有一個start_date
。現在我想添加一個open_until
列,並且我想用它填充每個現有記錄的start_date
的值。 (即將到來的記錄將可以選擇不同的值)
有沒有一種友好的方式來做到這一點?
正如我回答你,在數據庫級別設置一個動態的默認值是沒有必要的,如果你是一個框架:)
最好的辦法,我認爲,是設置你列的值工作保存記錄前的視圖。
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!!")
這是一堆黑客。 Op要求遷移舊數據,而不是如何處理新創建的記錄。數據遷移是正確的Djangoish做法。創建一次性視圖?爲什麼?如果你真的想避免數據遷移,比如說,你還在原型設計中,只需從CLI運行該功能,不需要構建視圖...... Hacky hacky hacky – 2016-07-01 09:40:33
你也可以做到這一點內南。唯一需要注意的是,你需要兩個步驟:
一個架構遷移,增加了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
一個數據遷移,填補現有具有該列值的行
$ 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中,你可以提供一個臨時的默認值,或使其可選的,並且增加一個第三步驟
不是數據庫級別,請在forms.py中執行此操作。 – elmonkeylp 2014-09-01 16:33:02
@elmonkeylp但這會如何定位所有以前的條目? – confused00 2014-09-01 16:49:41
在數據庫中設置了默認值後,就已經完成了。 – elmonkeylp 2014-09-01 16:54:02