代码之家  ›  专栏  ›  技术社区  ›  Milano

Django -新字段:如何设置现有对象的默认可调用性

  •  3
  • Milano  · 技术社区  · 6 年前

    我有一个模型:

    class Model(models.Model):
        price = models.DecimalField(...)
    

    已经有了 Model 生产数据库中的对象。 现在我添加 price_total 这个模型的字段不能是 null .

    class Model(models.Model):
        price = models.DecimalField(...)
        price_total = models.DecimalField(...)
    

    我想要这个 总价 等于 price 就在移民之后。

    类似于:

    price_total = models.DecimalField(default=this_object.price,...)
    

    有可能吗?

    我只知道:

    1. 制作 总价 可空的
    2. 进行迁移+迁移
    3. 设置 总价 等于 价格 例如通过 django shell
    4. 制作 总价 不可空
    5. makemigration+迁移

    但是这种方法有很多缺点,你可以忘记在生产中,它有许多步骤等…

    有更好的办法吗?

    2 回复  |  直到 6 年前
        1
  •  8
  •   Brown Bear    6 年前

    您可以通过手动编辑迁移来完成,

    1. 使用空值执行makemigration
    2. 执行不为空的makemigration
    3. 编辑首先通过添加数据更新和第二迁移文件的移动操作来进行迁移
    4. 删除第二个迁移文件,

    例如:

    from django.db import migrations, models
    from django.db.models import F
    
    def set_price_total(apps, schema_editor):
        # Change the myapp on your
        Model = apps.get_model('myapp', 'Model')
        Model.objects.update(price_total=F('price'))
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('myapp', '0001_initial'),
        ]
    
        operations = [
            migrations.AddField(
                model_name='model',
                name='price_total',
                field=models.DecimalField(
                    decimal_places=2, max_digits=10, null=True),
            ),
    
            migrations.RunPython(set_price_total),
    
            migrations.AlterField(
                model_name='model',
                name='price_total',
                field=models.DecimalField(
                    decimal_places=2, default=1, max_digits=10),
                preserve_default=False,
            ),
        ]
    
        2
  •  3
  •   Benjamin Toueg    6 年前

    你正朝着正确的方向努力。

    确保第3步在 datamigration (当然不是通过Django Shell)。

    这样你就不会忘记在生产中运行它了。

    我确信你不能同时添加列和设置值与另一列相同。

    为了说服自己,您可以搜索香草SQL实现 https://stackoverflow.com/a/13250005/1435156