MySQL 报告“字段列表中未知列 'user.id'”错误,使用 Django 自动生成的 id

0 投票
2 回答
3112 浏览
提问于 2025-04-18 16:54

我设置了一个 User 模型,没有主键,所以会自动使用 id。但是,当我通过外键使用 Django 的 "_set" 语法来访问它时:

def postDetails(request, pk)
    post = Post.objects.get(pk=pk)
    if post.user_set.all(): # Errors on this line
        [...]

我收到了 MySQL 的错误提示:

在 /webApp/postDetail/42/ 出现了 OperationalError (1054, "在 '字段列表' 中找不到 'user.id' 这一列")

我哪里做错了?我应该用其他方式访问吗?自动生成的 id 有什么限制吗?

模型参考:

class Post(models.Model):
    name = models.CharField(max_length=128)
    blog = models.ForeignKey('Blog')
    active = models.BooleanField(blank=True)
    created_date = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'post'
    def __unicode__(self):
        return self.name

class User(models.Model):
    level = models.ForeignKey(Level)
    post = models.ForeignKey(Post)
    name = models.CharField(max_length=64)
    note = models.CharField(max_length=4096)
    active = models.BooleanField(blank=True, default=True)
    class Meta:
        managed = False
        db_table = 'user'

还有一点我想补充:在运行这个之前,我确实运行过 syncdb

2 个回答

0

我不是百分之百确定,但我觉得即使Django会在模型类中添加id字段,这个字段也不会通过syncdb同步到数据库。

你可以试试一种方法,就是先把现有的User表重命名,然后运行syncdb,看看User表是否会被创建。如果没有被创建(这很可能是因为有一个管理标志),那么再试一次,把管理标志设置为True。如果这时候id字段出现了,那么我猜你可能需要手动把它添加到User表中,参数要和自动创建的那个一样。

0

编辑:答案错误,请查看下面的评论

问题在于你把 managed 设置为 False。根据文档

如果设置为 False,那么这个模型就不会进行任何数据库表的创建或删除操作。这在模型代表一个已经存在的表或者是通过其他方式创建的数据库视图时非常有用。当 managed=False 时,唯一的区别就是这一点。模型的其他处理方式和正常情况下完全一样。这包括:

如果你没有声明主键字段,系统会自动为模型添加一个主键字段。为了避免后续代码阅读者的困惑,建议在使用非管理模型时,明确指定你所建模的数据库表中的所有列。

你需要定义 primary key,因为现在默认情况下不会自动创建了。

撰写回答