修复方法:Django错误:无此类表:main.classroom_student__old - python

我遵循this tutorial来学习如何创建具有多种用户类型(在这种情况下是教师和学生)的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)。这会造成问题吗?

参考方案

1.0)首先尝试:

python manage.py migrate YOURAPPNAME --fake

2.0)如果仍然无法正常工作,请删除应用程序迁移中的所有迁移文件(init.py除外)和pycache文件夹。之后,运行makemigrations并进行迁移。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

如果__name__ =='__main__',则为Python的Powershell等效项: - python

我真的很喜欢python的功能,例如:if __name__ == '__main__': #setup testing code here #or setup a call a function with parameters and human format the output #etc... 很好,因为我可以将Python脚本文件…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…