2016-06-16 2 views
2

Я пытаюсь простую модель наследования:«makemigrations» просит дефолта ни с кем-абстрактной модели наследования

class Product(models.Model): 
    creation_date = models.DateTimeField(auto_now_add=True) 

class Application(Product): 
    name = models.CharField(max_length=200) 

«makemigrations» запрашивает по умолчанию:

Вы пытаетесь добавьте поле с нулевым значением 'product_ptr' в приложение без значения по умолчанию; мы не можем этого сделать (для базы данных требуется что-то, чтобы заполнить существующие строки).

Я видел here, что я мог бы продукт абстрактная модель с мета-класса, но я не могу этого сделать, так как я refereing его специально в других моделях в качестве реальной модели:

class Comment(models.Model): 
    product  = models.ForeignKey('Product', related_name="comments") 

Выполнение «makemigrations» при удалении базы данных также приводит к той же проблеме.

Все, что я могу сделать?

Джанго 1,9

+0

попробуйте изменить его на это имя = models.CharField (max_length = 200, default = 'Blah') и повторите попытку –

+0

Имеет ли приложение уже существующее, и вы перемещаете его как подкласс продукта? –

ответ

2

Вы не объяснили, что именно те изменения, которые вы сделали, кажется, что вы изменили свою Application модель наследовать от Product, где он ранее унаследованного от models.Model. Это заставляет django создавать отображение 1 к 1 за кулисами. Добавление product_ptr, которые вы не добавили к модели самостоятельно входит в картину

реф: https://docs.djangoproject.com/en/1.9/topics/db/models/#multi-table-inheritance

отношения наследования вводит связь между моделью детского и каждого из своих родителей (через автоматически - созданный OneToOneField).

Немного сложно добавить это поле в таблицу с данными во время миграции, потому что это поле должно быть уникальным. Если вы просто создаете новую модель с именем Application, значение 1 будет в порядке.

+0

Спасибо! удаление старого файла миграции, похоже, сделало трюк (по крайней мере, с точки зрения миграции) – billy

+0

Это приведет к тому, что это будет рассматриваться как новая модель, я думаю – e4c5