2

Скажем, у меня есть модель, представляющая продукт моей компании. Каждый продукт представляет собой номер продукта (например, 5928523), а также логическое выражение, представляющее, является ли это экспериментальным продуктом.Перенос базы данных Django: объединение двух полей в один

class Product(models.Model): 

    product_number = models.IntegerField() 
    experimental = models.BooleanField(default=False) 

Скажите, что я хочу объединить эти два поля в одно поле символов, идентификатор продукта. Таким образом, экспериментальный продукт с номером продукта 3892 превратится в «X3892», а неэкспериментальный продукт с номером продукта 937 просто превратится в «937».

class Product(models.Model): 

    product_id = models.CharField() 

Как написать миграцию базы данных в Django для достижения этой цели?

+0

Используйте миграцию данных https://docs.djangoproject.com/en/1.9/topics/migrations/#data-migrations – fasouto

+0

Я прочитал документацию Django на «Записи миграции базы данных» и «Миграция», к сожалению, ни в документации, ни в Google нет много примеров. Я не знаю, как выглядит мой список операций [] в моем файле миграции для этого конкретного приложения. –

ответ

2

Я не тестировал его, но что-то подобное должно работать. Сначала создайте миграцию, чтобы добавить product_id.

Затем создайте пустую миграцию и приспособите create_product_id так, как вам нужно.

Не забудьте изменить имя файла для имени вашего приложения.

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import migrations, models 

def create_product_id(apps, schema_editor): 
    Product = apps.get_model("yourappname", "Product") 
    for product in Product.objects.all(): 
     p_id = str(product.product_number) 
     if product.experimental: 
      p_id = "X" + p_id 
     product.product_id = p_id 
     product.save() 

class Migration(migrations.Migration): 
    initial = True 

    dependencies = [ 
     ('yourappname', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(create_product_id), 
    ] 
+0

Я попробую это. Вам также не нужно удалять старые поля? –

+0

Да, но вы должны удалить их позже в другой миграции. Будьте осторожны. – fasouto

+0

Можно ли создавать поля и изменять их при одной и той же миграции? –

Смежные вопросы