2012-09-22 49 views
2

运行我在Django的application.I的models.py有这些类正在使用PostgreSQL 8.3作为数据库中找不到关系时执行syncdb是在Django

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 

UPDATE: 我解决了这个如下

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()] 

不过,我不太清楚为什么会发生这种行为。有人请解释一下吗?

回答

3

把你的表单放入你的models.py文件中并不是好的做法,这正是为什么。

要运行syncdb,首先需要加载模型文件。在进行任何数据库更新之前,这当然必须发生。

现在,您的models.py文件包含一个窗体类,并且该类定义依赖于该表存在。 (这只是Python工作方式的一部分 - 您的类定义在导入模块时执行)。因此,在添加表之前,syncdb必须加载需要表格存在的模块。

当您更改表单类时,您移动了依赖于新表的行 - 现在它位于__init__方法内。与类定义不同,该方法在导入时不会运行。它只在您实际创建表单对象时运行。现在syncdb可以导入你的新模块并更新数据库,并且一切正常。