我正在关注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)。这会造成问题吗?
答案 0 :(得分:0)
1.0)首先尝试:
python manage.py migrate YOURAPPNAME --fake
2.0)如果仍然无法正常运行,请删除应用迁移中的所有迁移文件( init .py 除外)和< em> pycache 文件夹。之后,运行makemigrations并进行迁移。
答案 1 :(得分:0)
只需结束问题,@ SwapnilBhate的答案正确;这是sqlite版本3.26.0。降级到3.24.0,删除目录并重新安装后,一切正常。
答案 2 :(得分:0)
另一个使您列出的教程成功运行的解决方案不是降级为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
答案 3 :(得分:-1)
使用django == 2.2.7
然后python manage.py migrate
,
最后python runserver