29
class dbview(models.Model):
    # field definitions omitted for brevity
    class Meta:
        db_table = 'read_only_view'

def main(request):
    result = dbview.objects.all()

渲染时遇到异常:(1054,“'字段列表'中的未知列'read_only_view.id ' ”)

我在视图中看不到主键。有解决方法吗?

评论:
我无法控制使用 Django 访问的视图。MySQL 浏览器在那里显示列但没有主键。

4

4 回答 4

25

当你说‘我无法控制我使用 Django 访问的视图时。MySQL 浏览器在那里显示列,但没有主键。

我假设您的意思是这是一个旧表,并且您不允许添加或更改列?

如果是这样并且确实没有主键(即使是字符串或非 int 列*),那么该表还没有设置好,性能可能很糟糕。

不过对你来说没关系。您所需要的只是保证每一行都是唯一的列。在您的模型中将其设置为 'primary_key = True ,Django 会很高兴。

  • 还有另一种可能存在问题。如果没有保证唯一的列,则该表可能正在使用复合主键。也就是说 - 它指定将两列放在一起将提供一个唯一的主键。这是完全有效的关系建模,但不幸的是 Django 不支持。在这种情况下,除了原始 SQL 之外,您无能为力,除非您可以添加另一列。
于 2009-03-04T10:50:30.487 回答
17

我一直有这个问题。我有一个不能或不想更改的视图,但我希望有一个页面来显示复合信息(可能在管理部分)。我只是覆盖保存并引发 NotImplementedError:

    def save(self, **kwargs):
        raise NotImplementedError()

(虽然这在大多数情况下可能不需要,但它让我感觉好一点)

我还在 Meta 类中将 managed 设置为 False。

    class Meta:
       managed = False

然后我只需选择任何字段并将其标记为主键。它是否真的独一无二并不重要,您只是在做过滤器以在页面上显示信息等。

似乎对我来说工作得很好。如果我忽略了这种技术有任何问题,请发表评论。

于 2012-07-21T18:48:37.020 回答
3

如果视图中确实没有主键,则没有解决方法。

Django 要求每个模型只有一个字段primary_key=True

于 2009-03-03T11:51:13.377 回答
1

运行时应该有一个自动生成的id字段syncdb(如果您的模型中没有定义主键,那么 Django 会AutoField为您插入一个)。

此错误意味着 Django 正在向您的数据库询问该id字段,但不存在。你可以运行django manage.py dbshell然后DESCRIBE read_only_view;发布结果吗?这将显示数据库中的所有列。

或者,您可以包含您排除的模型定义吗?(并确认您在运行后没有更改模型定义syncdb?)

于 2009-03-03T11:40:18.003 回答