关于 Django 和 Python:
错误:
在我的 manage.py sql 对象中
CREATE TABLE "objects_thing" (
otherstuff,
otherstuff,
"name_id" integer NOT NULL REFERENCES "profiles_name" ("id"),
otherstuff,
);
所以它显然存在。
我已经运行了同步数据库。
为什么我收到这个错误?我该如何修复它? (我是所有这些的新手)在此先感谢您的帮助。
编辑:
事物模型:
class Thing(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
name = models.ForeignKey(Name)#The name for this thing
current_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
target_allocation = models.DecimalField(max_digits=13, decimal_places=2, null=True, blank=True)
placeholder = models.ForeignKey(Entity, null=True, blank=True, on_delete=models.SET_NULL)
avatar = models.ImageField(upload_to='avatars/thing/', null=True, blank=True)
最佳答案
syncdb
不会更改数据库中的现有表,因此如果您运行它,然后更改模型,您的模型现在与其代表的表不同步。再次运行 syncdb
不会解决这个问题。
您要么需要使用 south 之类的东西来进行迁移,从数据库中删除该表,以便 syncdb
将重新创建它,要么在您的数据库上手动运行 ALTER TABLE。
编辑(更详细)
当您在 models.py 中创建 Model
的子类时,它充当数据库表的表示,但不会自动拥有数据库表。您可以通过运行 python manage.py syncdb
来获得它。然后,Django 查看您所有的 models.py 文件,生成实际创建这样的表所需的 SQL,然后在您的数据库上运行它。最终结果是您最终得到与您的模型相关联的实际数据库表。
但是,syncdb
只创建表。它不会改变它们。因此,如果您更改模型之一(添加字段、更改字段名称等),则数据库级别不会发生任何事情。再次运行 syncdb
也无济于事,因为没有要创建的新表。但是,您必须以某种方式让表格与模型匹配,反之亦然,所以这就是您的选择:
python manage.py schemamigration --auto yourapp
它会生成代码来改变表格以匹配您的模型。然后,您只需要通过以下方式应用迁移:
python manage.py migrate yourapp
你已经完成了。该表现在与您的模型匹配,一切又恢复正常。
python manage.py syncdb
因为,该表不再存在,Django 将创建它,但它会根据您当前模型的状态创建它。最终结果是相同的,您的模型和表格匹配,所以您很高兴。
关键是,不知何故,您必须更新表格以反射(reflect)您对模型所做的任何更改。模型不是表格,它只是它的程序化表示。
关于python - "DatabaseError, column does not exist"。但是在我的 manage.py sql 中显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9218211/