关于Django和Python:
错误:
异常类型:DatabaseError异常值:
列objects_thing.name_id不存在第1行:... s_thing"."创建","objects_thing"."修改","对象......
在我的manage.py sql对象中
CREATE TABLE "objects_thing" (
otherstuff,
otherstuff,
"name_id" integer NOT NULL REFERENCES "profiles_name" ("id"),
otherstuff,
);
Run Code Online (Sandbox Code Playgroud)
所以它显然存在.我已经运行了syncdb.为什么我收到此错误?我该如何修复呢?(我是所有这一切的新手)提前感谢您的帮助.
编辑:
事物模型:
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)
Run Code Online (Sandbox Code Playgroud)
syncdb不会更改数据库中的现有表,因此如果运行该表,然后更改模型,则模型现在与其表示的表不同步.syncdb再次运行不会解决这个问题.
您需要使用像south这样的东西进行迁移,从数据库中删除表以便syncdb重新创建表,或者在数据库上手动运行ALTER TABLE.
编辑(更多细节)
Model在models.py中创建子类时,它充当数据库表的表示形式,但不会自动拥有数据库表.你通过跑步得到它python manage.py syncdb.然后,Django查看所有models.py文件,生成实际创建这样的表所需的SQL,然后在数据库上运行它.最终结果是您最终得到了与模型相关的实际数据库表.
但是,syncdb只创建表.它不会改变它们.因此,如果您去更改其中一个模型(添加字段,更改字段名称等),则数据库级别不会发生任何变化.syncdb再次运行也无济于事,因为没有新表可以创建.你必须以某种方式让表格与模型相匹配,反之亦然,所以这就是你的选择所在:
使用南(上面的链接).South允许您创建迁移,因此当您在模型上更改某些内容时,您可以运行:
python manage.py schemamigration --auto yourapp
Run Code Online (Sandbox Code Playgroud)
它将生成将改变表格以匹配您的模型的代码.然后,您只需要应用迁移:
python manage.py migrate yourapp
Run Code Online (Sandbox Code Playgroud)
而且你已经完成了.该表现在与您的模型匹配,所有这些都在世界上.
您可以手动从数据库中删除该表.您不希望在生产中执行此操作,因为该表中的所有数据都将与其一起使用,但在开发中它应该不是问题.表格消失后,您可以运行:
python manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
因为该表不再存在,Django将创建它,但它将根据您当前模型的状态创建它.最终结果是相同的,你的模型和表匹配,所以你很高兴.
您可以手动更改表格.这要求您确定需要应用哪些SQL来更改表以匹配您的模型.您在数据库上运行此SQL,然后该表与模型保持一致.
重点是,不知何故,您必须更新表格以反映您对模型所做的任何更改.该模型不是表,它只是它的程序化表示.
| 归档时间: |
|
| 查看次数: |
5807 次 |
| 最近记录: |