2016-01-22 42 views
1

我收到此错误的Django的模型:Django的给神秘的错误为外键

ProgrammingError at /admin/notifications/eventtoken/ column notifications_eventtoken.user_id does not exist LINE 1: ...ications_eventtoken" INNER JOIN "users_user" ON ("notificat... ^ HINT: Perhaps you meant to reference the column "notifications_eventtoken.used_at".

我添加了用户这样一个外键:

class EventToken(models.Model): 
    token = models.CharField(max_length=255, db_index=True) 
    user = models.ForeignKey(User, null=False, blank=False) 
    used_at = models.DateTimeField(null=True, blank=True) 
    event = models.ForeignKey(Event) 

它的工作原理,当我删除用户字段,但除此之外,我不能告诉错误信息。

+0

您可以添加完整的错误堆栈跟踪吗? –

+0

您是否在添加新的'user'字段后运行迁移?即您的数据库表是否与您的模型保持同步? –

回答

2

它在我删除用户字段时起作用。

这是因为您的数据库缺少您在EventToken类中编写的列,我猜的是在notifications/models.py之内。这就是为什么它被称为ProgrammingError

有几种方法来解决这个问题:

再次删除您的整个数据库和同步吧!不建议用于生产中的任何东西,但对于测试项目而言,确实不会造成太大的伤害。

2.使用像southdjango migrate app工具(取决于Django的您正在使用的版本)来自动使用manage.py脚本将表添加到您的数据库。编辑:这个解决方案是最可行的,因为在多个开发环境中工作时,它是快速的并遵循DRY原则。

3a。使用命令行工具手动进入数据库并添加缺少的列。如果我没有说清楚...你说“我想将user_id外键保存在这张表中”,而你的表格回复说“没有地方可以保存这个ID”......)

3B。使用数据库GUI(如pgAdmin的PostgreSQL的)和user_id列添加到您的notifications_eventtoken数据库表。

4. 删除在EventToken类用户现场! 不要做到这一点,但了解它的工作原理,因为它清除了逻辑差异。

+1

建议选项2在这里是您想要查看的选项,因为它将具有其他好处并防止将来发生类似问题。 – ChidG