我在django应用程序的models.py中有这些类。我使用postgresql 8.3作为数据库
class Course(models.Model):
students = models.ManyToManyField(User)
title = models.CharField(max_length=200)
description = models.TextField()
def __unicode__(self):
return self.title
class Meta:
verbose_name_plural="Courses"
class CourseChoicesForm(forms.Form):
courseoption = forms.ChoiceField(choices=[(x.id,x.title) for x in Course.objects.all()])
当我运行python manage.py syncdb
时,出现错误,显示relation course is not found
...
File "/home/me/Django-1.4/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/me/dev/python/django/myprj/myapp/models.py", line 50, in <module>
class CourseChoicesForm(forms.Form):
File "/home/me/dev/python/django/myprj/myapp/models.py", line 52, in CourseChoicesForm
courseoption = forms.ChoiceField(choices=[(x.id,x.title) for x in Course.objects.all()])
...
File "/home/me/Django-1.4/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "myapp_course" does not exist
更新 我解决了这个问题如下
class CourseChoicesForm(forms.Form):
courseoption = forms.ChoiceField(choices=[],required=False)
def __init__(self, *args, **kwargs):
super(CourseChoicesForm, self).__init__(*args, **kwargs)
self.fields['courseoption'].choices = [(x.id,x.title) for x in Course.objects.all()]
不过,我不太清楚为什么会出现这种情况。有人可以解释一下吗?
答案 0 :(得分:3)
将表单放在models.py文件中并不是一个好习惯,这就是原因。
要运行syncdb
,首先需要加载模型文件。这肯定要在它可以进行任何数据库更新之前发生。
现在,您的models.py文件还包含一个表单类,该类定义依赖于所存在的表。 (这只是Python工作方式的一部分 - 您的类定义在导入模块时执行)。因此,在添加表之前,syncdb
必须加载一个模块,该模块要求表存在。
当您更改表单类时,您移动了依赖于新表的行 - 现在它位于__init__
方法中。与类定义不同,该方法不会在导入时运行。它仅在您实际创建表单对象时运行。现在syncdb
可以导入新模块并更新数据库,一切正常。