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浏览器显示那里的列但没有主键。
答案 0 :(得分:18)
当你说'我无法控制我使用Django访问的视图时。 MySQL浏览器显示那里的列但没有主键。'
我认为您的意思是这是一个旧表,您不能添加或更改列?
如果是这样,并且确实没有主键(即使是字符串或非int列*),那么该表还没有很好地设置,性能可能会很糟糕。
虽然对你没关系。您所需要的只是一列保证每行都是唯一的。在模型中将其设置为'primary_key = True,Django会很高兴。
答案 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
以来未更改模型定义?)