Ненулевое поле Python django

#python #django #django-models

#python #django #django-модели

Вопрос:

Вот мой models.py

 class Product(models.Model):
    product_id = models.AutoField
    product_name = models.CharField(max_length=50)
    category = models.CharField(max_length = 50, default="")
    price = models.ImageField(default=0)
    sub_category = models.CharField(max_length = 50,default="")
    desc = models.CharField(max_length=300)
    pub_date = models.DateField()
    image = models.ImageField(upload_to="shop/images", default="")
 

И я получаю строку ниже. Я не знаю, является ли это предупреждением или ошибкой:
Вы пытаетесь добавить ненулевое поле ‘pub_date‘ в продукт без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк).

Что это значит на самом деле??

Комментарии:

1. Что неясно в сообщении об ошибке?

2. Это говорит мне — (базе данных нужно что-то для заполнения существующих строк).

Ответ №1:

Вы уже создали миграции, в которых вы создаете таблицу для Product таблицы. Таким образом, возможно, что для этой таблицы уже есть записи.

Теперь вы добавляете новый столбец, это означает, что вам нужно заполнить столбец для существующих записей. Вы не указали default=… параметр [Django-doc], следовательно, Django не может использовать это в качестве значения.

Для поля с null=True [Django-doc] без значения по умолчанию по умолчанию оно будет использовать None / NULL в качестве значения, но здесь ваше pub_date поле не является обнуляемым.

Таким образом, это означает, что Django не знает, что здесь делать. Обычно Django предлагает два решения:

  1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
 

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

Таким образом, вы выбираете первый вариант, записывая 1Enter), затем вы можете ввести выражение, которое указывает, что использовать по умолчанию, например timezone.now , по умолчанию для существующих записей, а не для новых записей:

 Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> timezone.now  # Enter 

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

Если вы выберете 2Enter), Django прекратит создание файла миграции и даст вам возможность самостоятельно указать значение по умолчанию в models.py : затем это будет использоваться для всех существующих и новых записей. Например:

 from django.utils import timezone

class Product(models.Model):
    # …
    pub_date = models.DateField(default=timezone.now)
    # … 

Вы также можете использовать auto_now_add=True [Django-doc] для автоматического использования текущей даты в качестве значения и сделать поле недоступным для редактирования:

 class Product(models.Model):
    # …
    pub_date = models.DateField(auto_now_add=True)
    # …