I have two classes, one of which comes from the other, and I would like to make them both classes of brothers belonging to the same base class.
Before:
from django.db import models class A(models.Model): name = models.CharField(max_length=10) class B(models.Model): title = models.CharField(max_length=10)
After:
from django.db import models class Base(models.Model): name = models.CharField(max_length=10) class A(Base): pass class B(Base): title = models.CharField(max_length=10)
When I generate a schema migration, this is the result, including my answers to the questions:
+ Added model basetest.Base ? The field 'B.a_ptr' does not have a default specified, yet is NOT NULL. ? Since you are removing this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? 3. Disable the backwards migration by raising an exception. ? Please select a choice: 3 - Deleted field a_ptr on basetest.B ? The field 'B.base_ptr' does not have a default specified, yet is NOT NULL. ? Since you are adding this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? Please select a choice: 2 ? Please enter Python code for your one-off default value. ? The datetime module is available, so you can do eg datetime.date.today() >>> 37 + Added field base_ptr on basetest.B ? The field 'A.id' does not have a default specified, yet is NOT NULL. ? Since you are removing this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? 3. Disable the backwards migration by raising an exception. ? Please select a choice: 3 - Deleted field id on basetest.A ? The field 'A.name' does not have a default specified, yet is NOT NULL. ? Since you are removing this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? 3. Disable the backwards migration by raising an exception. ? Please select a choice: 3 - Deleted field name on basetest.A ? The field 'A.base_ptr' does not have a default specified, yet is NOT NULL. ? Since you are adding this field, you MUST specify a default ? value to use for existing rows. Would you like to: ? 1. Quit now, and add a default to the field in models.py ? 2. Specify a one-off value to use for existing columns now ? Please select a choice: 2 ? Please enter Python code for your one-off default value. ? The datetime module is available, so you can do eg datetime.date.today() >>> 73 + Added field base_ptr on basetest.A Created 0002_auto__add_base__del_field_b_a_ptr__add_field_b_base_ptr__del_field_a_i.py. You can now apply this migration with: ./manage.py migrate basetest
I do not know how to answer questions about the default values ββfor B.base_ptr and A.base_ptr. Any constant that I give causes the migration to crash when it starts with this output:
FATAL ERROR - The following SQL query failed: CREATE TABLE "_south_new_basetest_a" () The error was: near ")": syntax error RuntimeError: Cannot reverse this migration. 'B.a_ptr' and its values cannot be restored.
This is the result when I use sqlite3, by the way. Using Postgres gives something like this:
FATAL ERROR - The following SQL query failed: ALTER TABLE "basetest_a" ADD COLUMN "base_ptr_id" integer NOT NULL PRIMARY KEY DEFAULT 73; The error was: could not create unique index "basetest_a_pkey" DETAIL: Key (base_ptr_id)=(73) is duplicated. Error in migration: basetest:0002_auto__add_base__del_field_b_a_ptr__add_field_b_base_ptr__del_field_a_i IntegrityError: could not create unique index "basetest_a_pkey" DETAIL: Key (base_ptr_id)=(73) is duplicated.
What values ββshould be used for base_ptr to perform this migration? Thanks!