Django:查询没有主键的只读视图

时间:2009-03-03 10:36:47

标签: django django-models

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 个答案:

答案 0 :(得分:18)

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

我认为您的意思是这是一个旧表,您不能添加或更改列?

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

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

  • 还有另外一种可能存在问题的可能性。如果没有保证唯一的列,则表可能正在使用复合主键。也就是说 - 它指定两列一起提供唯一的主键。这是完全有效的关系建模,但Django不幸地支持它。在这种情况下,除了原始SQL之外你不能做很多事情,除非你可以添加另一个列。

答案 1 :(得分:13)

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

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

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

我还在Meta类中设置为False。

    class Meta:
       managed = False

然后我只选择任何字段并将其标记为主键。如果它真的是独一无二的,你只需要在页面上显示信息等过滤器就无所谓了。

似乎对我来说很好。如果我忽视这项技术有任何问题,请提出意见。

答案 2 :(得分:3)

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

Django requires each model to have exactly one field primary_key=True.

答案 3 :(得分:1)

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

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

或者,您可以包括您排除的模型定义吗? (并确认自您运行syncdb以来未更改模型定义?)