Предварительный просмотр сайта Django не обновляется после изменения model.py - PullRequest
1 голос
/ 24 июня 2019

Я учу Джанго и работаю над моделями. Я создал класс продукта

from django.db import models


class Product(models.Model):
    title = models.CharField(max_length=10)
    description = models.TextField(blank=False)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    featured = models.BooleanField(default=False)
    int = models.IntegerField(default=10)

и я пытаюсь удалить поле 'int', но сайт django не обновляется после смены.

После удаления поля модели (поле 'int', см. Скриншоты), и работает

python manage.py makemigrations

python manage.py migrate

предварительный просмотр в реальном времени не обновляется и выдает ошибку относительно стертого поля. после закрытия сервера и перезапуска сервера (Ctrl + C и затем python manage.py runserver страница обновляется и не выдает никаких ошибок

Я использую sqlite. Я попытался удалить ' pycache ', и все миграции также db.sql3, воссоздав суперпользователя, но после удаления любого поля я все еще получаю ту же ошибку.

рисунок 1 -> начальное состояние $ https://ibb.co/Yb6pmgr рисунок 2 -> после удаления поля 'int' https://ibb.co/xf1bJQJ картинка 3 -> ошибка: $ https://ibb.co/0cPyRZv

1 Ответ

0 голосов
/ 24 июня 2019

Сначала остановите сервер, затем внесите изменения и выполните команды python manage.py makemigrations и python manage.py migrate. Возможно, это сработает, но вы играете с зарезервированным ключевым словом в Python.

Если это не работает, сейчас просто удалите 0001_initial.py, который находится на пути trydjango/src/products/migrations/. Если у вас уже есть данные в вашей базе данных, сделайте резервную копию где-нибудь. int является одной из встроенных функций в Python. Пожалуйста, не используйте такое соглашение об именах в Python. Посмотрите на приведенный ниже пример, вы получите представление об этом.

str_val = '1'

print(str_val)  # 1
print(type(str_val))  # <class 'str'>

int_val = int(str_val)

print(int_val)  # 1
print(type(int_val))  # <class 'int'>

Это просто простой пример преобразования строкового значения в целочисленное с использованием int(). Давайте присвоим некоторое значение int().

# by default
print(int)  # <class 'int'>
print(type(int))  # <class 'type'>

# let's get the previous example again
str_val = '1'

print(str_val)  # 1
print(type(str_val))  # <class 'str'>

# assign some value to int(). (please please please never do such a thing like this)
int = 'assigned string'
print(int)  # 'assigned string'
print(type(int))  # <class 'str'>

int_val = int(str_val)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

Вы получите такую ​​же ошибку при выполнении кода выше. Так что int() больше не будет преобразовывать строку в целые числа. Потому что ты нарушил правило. Теперь это как обычная переменная. Тем не менее, если вы действительно хотите добавить переменную типа int, просто используйте _int или int_, а если вы хотите отобразить имя столбца как int, просто добавьте имя db_column.

_int = models.IntegerField(default=10, db_column='int')

# or

int_ = models.IntegerField(default=10, db_column='int')

Прежде чем вносить эти изменения, остановите сервер. Затем отредактируйте, после этого запустите python manage.py makemigrations и python manage.py migrate. Надеюсь, этот ответ вам как-то поможет.

ОБНОВЛЕНИЕ:

Этот ответ поможет вам найти все зарезервированные ключевые слова в Python и не использовать ни одно из них в качестве имен переменных.

...