Как добавить новый столбец в модель, которая ссылается на другую модель по внешнему ключу в Django - PullRequest
1 голос
/ 03 октября 2019

У меня есть модель с именем Shape:

class Shape(models.Model):
    name = models.CharField(max_length=40, unique=True)

и другая модель с именем Tank, которая имеет модель Shape в качестве иностранного ключа:

def get_default(model):
    value, is_created = model.objects.get_or_create(name=0)
    return value.id

class Tank(models.Model):
    name = models.CharField(max_length=50)
    shape = models.ForeignKey(Shape, on_delete=models.SET_DEFAULT,
                          default=get_default(Shape),
                          related_name="tanks")

, когда я пытаюсь добавить новый столбец (сnull = True) в модели Shape при python manage.py makemigrations django выдает ошибку: django.db.utils.OperationalError: no such column: tank_shape.Column name

1 Ответ

0 голосов
/ 03 октября 2019

У вас есть следующая строка, для аргумента default вы вызываете функцию, чтобы получить модель по умолчанию Shape:

shape = models.ForeignKey(Shape, on_delete=models.SET_DEFAULT,
                          default=get_default(Shape),
                          related_name="tanks")

Но переменная Shape модели name не делаетпо умолчанию. И Shape не будет иметь права по умолчанию само по себе. Поле в таблице Shape будет иметь значение по умолчанию, например. name. :

# Your code
name = models.CharField(max_length=40, unique=True)

Чтобы получить значение по умолчанию, вы можете использовать:

Shape._meta.get_field('name').get_default()

На основании вашего последнего комментария попробуйте изменить следующий код:

shape = models.ForeignKey(Shape, on_delete=models.SET_DEFAULT,
                          related_name="tanks")

РЕДАКТИРОВАНИЕ:

Предоставление полного кода в качестве ответа:

class Shape(models.Model):
    name = models.CharField(max_length=40, unique=True)

class Tank(models.Model):
    name = models.CharField(max_length=50)
    shape = models.ForeignKey(Shape, on_delete=models.SET_DEFAULT,
                          default=1,
                          related_name="tanks")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...