Почему я получаю необнуляемую ошибку поля и должен исправить для пользователя ForeignKey связать таблицы друг с другом? - PullRequest
0 голосов
/ 21 января 2019

Это мой код, и я продолжаю получать сообщение об ошибке!

from django.db import models

# Create your models here.
class topics(models.Model):
    topic_level             = models.BooleanField()
    topic_name              = models.TextField()
    topic_question          = models.ForeignKey('questions', on_delete=models.CASCADE)
    topic_answer            = models.ForeignKey('answers', on_delete=models.CASCADE)
    topic_image             = models.ForeignKey('images', on_delete=models.CASCADE)

class questions(models.Model):
    question_description    = models.TextField()
    questions_type          = models.BooleanField()
    question_answer         = models.ForeignKey('answers', on_delete=models.CASCADE)
    question_image          = models.ForeignKey('images', on_delete=models.CASCADE)

class answers(models.Model):
    description             = models.TextField()
    answer_image            = models.ForeignKey('images', on_delete=models.CASCADE)

class images (models.Model):
    image_blob              = models.BinaryField()

Это ошибка:

Вы пытаетесь добавить ненулевое поле 'answer_image' к ответам без дефолта; мы не можем этого сделать (базе данных нужно что-то заполнить существующие строки). жало строк). Пожалуйста, выберите исправление: 1) Предоставьте одноразовый по умолчанию сейчас (будет установлен на все существующие строки с нулевым значение для этого столбца) 2) Выйти, и позвольте мне добавить значение по умолчанию в models.py

Я хотел бы знать, если я добавлю значение по умолчанию, это повлияет на отношения между таблицами? И какую ценность добавить? Работает ли случайное значение? Спасибо,

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы пытаетесь добавить ненулевое поле. Поэтому, когда вы запускаете миграцию, django нужно заполнить это поле чем-то.

Сделать это поле обнуляемым:

answer_image = models.ForeignKey('images', on_delete=models.CASCADE,blank=True,null=True)

Затем вам нужно будет удалить последнюю миграцию и создать новую, а затем выполнить миграцию.

0 голосов
/ 21 января 2019

Это вероятно, потому что вы сделали migration ранее на model без поля answer_image. Поэтому, если вы не укажете атрибут default или не сделаете его null и blank, django предупредит вас о предоставлении значения по умолчанию, потому что the database needs something to populate existing row, если были вставлены строки, django захочет что-то заполнить эти строки в этом поле не являются null и не могут быть null или blank, даже если таблица пуста, django все равно предупредит вас.

Также сделайте следующее:

Первый вариант

Следуйте инструкциям, которые django печатает на консоли, выберите опцию 1 и укажите значение по умолчанию для заполнения существующих строк

Редактировать: значение не может быть случайным. Но с типом данных images, указанным в поле answer_image, поэтому вы вводите foreign_key, соответствующий объекту / строке images, поскольку django добавляет поле id ко всем моделям.

или

Второй вариант

Добавьте следующие атрибуты в ваше поле answer_image как следующие:

answer = models.ForeignKey(images, null=True, blank=True, on_delete=models.SET_NULL)

Затем примените миграцию (я предложил второй вариант, потому что я предполагаю, что вам не нужен сценарий, в котором строка удаляется в images таблице cascading всех соответствующих строк в таблице answer, поэтому в этом случае удаление установит поле answer_image null)

...