python - 如何修复:Django 错误:没有这样的表:main.classroom_student__old
问题描述
我正在按照本教程学习如何创建具有多种用户类型(本例中为教师和学生)的 Django (v2.0.1) 应用程序。我从Github Repository克隆了相关代码,迁移了预制迁移并使用以下命令在 localhost 上运行该站点:
python3 manage.py migrate
python3 manage.py runserver
该网站几乎可以完美运行(教师注册、登录、测验创建和学生登录都按顺序进行)。但是,学生注册失败并出现以下错误:
OperationalError at /accounts/signup/student/
no such table: main.classroom_student__old
回溯最终指向文件
django_school/classroom/forms.py, line 39:
student.interests.add(*self.cleaned_data.get('interests'))
该行来自该 forms.py 文件中以下类的定义:
class StudentSignUpForm(UserCreationForm):
interests = forms.ModelMultipleChoiceField(
queryset=Subject.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=True
)
class Meta(UserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_student = True
user.save()
student = Student.objects.create(user=user)
student.interests.add(*self.cleaned_data.get('interests'))
return user
我尝试过的:
在对本网站上许多类似问题的回答之后,我认为这是一个迁移问题,所以我尝试运行:
python manage.py migrate --run-syncdb
Operations to perform:
Synchronize unmigrated apps: crispy_forms, humanize, messages, staticfiles
Apply all migrations: auth, classroom, contenttypes, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Running migrations:
No migrations to apply.
但错误仍然存在。然后我删除db.sqlite3
了与应用教室相关的所有迁移文件。python3 manage.py makemigrations
然后我跟着跑了python manage.py migrate --run-syncdb
,再次无济于事。
这让我认为这是代码向“学生”用户对象添加“兴趣”的方式的问题。事实上,注释掉有问题的行会停止错误并创建新的学生用户,但是这有一个明显的问题,即学生没有存储任何兴趣。
跑步python manage.py sqlmigrate classroom 0001
节目:
...
-- Add field quizzes to student
--
ALTER TABLE "classroom_student" RENAME TO "classroom_student__old";
CREATE TABLE "classroom_student" ("user_id" integer NOT NULL PRIMARY KEY REFERENCES "classroom_user" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "classroom_student" ("user_id") SELECT "user_id" FROM "classroom_student__old";
DROP TABLE "classroom_student__old";
COMMIT;
因此,当另一个属性“测验”添加到学生用户对象时,正在创建和删除有问题的数据库 (classroom_student__old)。这会造成问题吗?
解决方案
而不是降级到 sqlite 3.24.0,使您列出的教程成功运行的另一个解决方案是在运行“pip install -r requirements.txt”命令之前将 requirements.txt 文件的 django 版本更改为 2.2.7。
因此,此项目的 requirements.txt 文件将是:
Django==2.2.7
django-crispy-forms==1.7.0
pytz==2017.3
推荐阅读
- javascript - 是否可以在 Google Doc 中的图像前添加换行符?
- visual-studio-code - 为什么当我在 VS Code 中对 Julia 进行编程时,快捷键“Ctrl + Enter”不会将我的当前行发送到 REPL?
- laravel - 为什么页码没有分配给刀片中的 Laravel 路由“?page=2”?
- reactjs - 无法使用 material-ui-color-picker 在输入字段中显示值
- javascript - 在 html 正文之前预加载画布?
- html - css中的独立滚动列布局
- python - 将熊猫数据集转换为 matplotlib 图:有没有办法将值附加到 y 值列表?
- excel - 使用 Laravel Excel 导入 excel 时计算公式
- spring-boot - 跟踪/跟踪 JSON 对象(时间序列数据)流经 IOT 平台上的微服务系统的最佳方法
- dataframe - 如何一次旋转两列?