Django таблица onlineshop_product не имеет столбца с именем name

Я работаю над проектом сайта интернет-магазина с помощью Django. и я новичок в Django Следующий код предоставляет таблицу моей базы данных. Он помогает добавить товар

``` class Product(models.Model):
category = models.ForeignKey(Category,related_name='products', on_delete=models.CASCADE)

name = models.CharField(max_length=200,db_index=True)
slug = models.SlugField(max_length=200,db_index=True)
image = models.ImageField(upload_to='products/%y/%m/%d',blank=True)
description = models.TextField(blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True) ```

Показывает мне ошибку в браузере. Эта ошибка появляется, когда я добавляю товар в панели администратора. Он помогает добавить товар, но когда я добавляю товар, возникает следующая ошибка.

Операционная ошибка в /admin/onlineshop/product/add/

В таблице onlineshop_product нет столбца с именем name

когда я выполнил миграцию с помощью команды

``` python manage.py migrate ```

он появится

Операции для выполнения: Применить все миграции: admin, auth, contenttypes, onlineshop, sessions Выполняемые миграции: Нет миграций для применения. Ваши модели в app(s): 'onlineshop' имеют изменения, которые еще не отражены в миграции, и поэтому не будут применены. Запустите 'manage.py makemigrations' для создания новых миграций, а затем повторно запустите 'manage.py migrate' для их применения.

``` python manage.py makemigrations ```

Невозможно добавить поле 'created' с 'auto_now_add=True' к продукту без предоставления поля по умолчанию. Это происходит потому, что базе данных необходимо что-то для заполнения существующих строк.

  1. Предоставить одноразовое значение по умолчанию, которое будет установлено для всех существующих строк
  2. Выйти и вручную определить значение по умолчанию в models.py. Выберите опцию:

Как решить

Это известный вопрос, обратитесь к here[django-doc] для этого, это будет легко, если вы выберете первый вариант.

Выбираем первый вариант:

Затем в вашей оболочке будет показано что-то вроде этого:

Select an option: 1
Please enter the default value now, as valid Python
You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
[default: timezone.now] >>>

Здесь просто нажмите Enter, поле будет добавлено в миграцию и ваша работа закончена, затем просто выполните команду migrate. Вы также можете проверить это в файле migration.

Файл миграции

operations = [
        migrations.AddField(
            ....
            field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
        )
    ]

измените свой Product(...) класс так

from django.db import models
from datetime import datetime

class Product(models.Model):
    # ... all other fields
    name = models.CharField(max_length=200, db_index=True, default='Name not provided')
    created = models.DateTimeField(auto_now_add=True, null=True)
    updated = models.DateTimeField(auto_now=True, null=True)

и выполните эти команды в последовательности

python manage.py makemigrations your_app_name # app name is optional parameter if you have app then provide app name
python manage.py migrate

Хотя настройки null = True - плохая идея, но это решит вашу проблему на данный момент, но если вы хотите исправить эту проблему, вы можете следовать этому посту или этому ответу

Вернуться на верх