use*_*680 6 django django-models
我有一个带有两个字段的小型 django 模型。数据库中已有此模型的数据。
class MetaDataValue(Model):
metadata_id = models.ForeignKey(MetaData, on_delete=models.CASCADE,)
value = models.CharField('value', max_length=200,)
Run Code Online (Sandbox Code Playgroud)
我需要添加另一个字段,
short_value = models.CharField('short_value', max_length=200,)
Run Code Online (Sandbox Code Playgroud)
我知道当我执行迁移时,它会抱怨,因为我没有数据库中现有行的默认值。
有没有办法为数据库/模型中已经存在short_value的value字段中的字符串设置默认值?
我想这样做是因为我只需要为short_value数据库中的大约 20 行创建一个不同的,并且这个字段没有通用的默认值。我宁愿不在short_value字段中使用“fred”或“default”之类的东西,因为有些字段有数字,有些有文本,有些有数字和文本的组合。我也想过创建一个属性而不是另一个模型字段,但是没有一种简单的方法可以将value字段转换为short_value字段。
谢谢!
Wil*_*sem 12
您可以简单地将该字段添加到模型并调用:
python3 manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)
Django 将提示您为此填写“一次性”默认值。例如,如果我在你的模型上运行这个,我会看到:
You are trying to add a non-nullable field 'short_value' to metadatavalue without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 'default'
Migrations for 'app':
app/migrations/0002_metadatavalue_short_value.py
- Add field short_value to metadatavalueRun Code Online (Sandbox Code Playgroud)
(粗体部分是我自己写的东西)。
因此,这里的行将文本default作为值。
“一次性”值不是为您的模型指定的默认值。它只是一个存储在迁移文件中的值,并添加到可能已经存在的行中。
我们可以对迁移文件进行后期编辑,并为该列提供一个默认值,然后运行一个函数,该函数基本上将值从另一列复制到新列,例如:
# Generated by Django 2.0.2 on 2019-02-24 19:45
from django.db import migrations, models
def copy_value_to_short_value(apps, schema_editor):
MetaDataValue = apps.get_model('app', 'metadatavalue')
db_alias = schema_editor.connection.alias
from django.db.models import F
MetaDataValue.objects.using(db_alias).all().update(
short_value=F('value')
)
class Migration(migrations.Migration):
dependencies = [
('app', '0001_initial_commit'),
]
operations = [
migrations.AddField(
model_name='metadatavalue',
name='short_value',
field=models.CharField(default='value', max_length=200, verbose_name='short_value'),
preserve_default=False,
),
migrations.RunPython(copy_value_to_short_value),
]Run Code Online (Sandbox Code Playgroud)
因此copy_value_to_short_value,我们定义了一个看起来类似于 Django ORM 查询的函数,然后我们将 加入migrations.RunPython(copy_value_to_short_value)到应该在迁移中完成的任务中。
您当然应该在运行迁移之前编辑迁移文件,否则迁移会出现在表中,并且 Django 认为迁移已“完成”。django_migrations
| 归档时间: |
|
| 查看次数: |
7910 次 |
| 最近记录: |