如何在Django中为现有模型添加唯一字段(非空)字段?

时间:2017-07-13 21:29:52

标签: django

我的模型看起来像这样:

class FoodPreferences(models.Model):
    foods = models.ManyToManyField(to='Food', db_index=True,
                                      through='FoodToPreferenceMap')
    is_vegan = models.BooleanField(default=True)
    some_new_unique_field = models.CharField(max_length=64, unique=True)

现在我想将some_new_unique_field添加到模型中,但由于它没有默认值,因此迁移会询问我一个新值。该字段应该基于每行的食物值来计算。我该怎么做呢?是否可以设置一个动态计算的默认值?

编辑:

我尝试自定义迁移,这是我的迁移:

def gen_stuff(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'foodpreferences')
    while MyModel.objects.filter(some_new_unique_field__isnull=True).exists():
        with transaction.atomic():
            for row in MyModel.objects.filter(some_new_unique_field__isnull=True)[:1000]:
                row.some_new_unique_field = row.generate_new_field_stuff()
                row.save(update_fields=['some_new_unique_field'])


class Migration(migrations.Migration):
    dependencies = [
        ('stars_api', '0074_foodpreferences_ some_new_unique_field'),
    ]

    operations = [
        migrations.RunPython(gen_stuff, reverse_code=migrations.RunPython.noop)
    ]

但我遇到了

AttributeError: 'FoodPreferences' object has no attribute 'generate_new_field_stuff'

编辑:修正了它,它使用get_model

创建了一个浅表副本

1 个答案:

答案 0 :(得分:2)

以下是对django doc的建议。你可以尝试一下。简而言之,它说:

  • 首先创建一个允许new_field可以为空的迁移;
  • 然后创建另一个迁移,使用适当的值将new_field填充到模型中的每一行;
  • 然后是另一个在列中添加非空约束的迁移。