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

 2021-04-27 

Django: Querying read-only view with no primary key

1
2
3
4
5
6
7
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浏览器在那里显示列,但没有主键。


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

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

如果确实没有主键(即使是字符串或非int列*),则表的设置也不太好,性能可能会发臭。

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

  • 还有另一种可能会出现问题的可能性。如果没有保证唯一的列,则表可能正在使用复合主键。即-指定两列在一起将提供唯一的主键。这是完全有效的关系建模,但不幸的是,Django不支持这种关系建模。在这种情况下,除非您可以添加另一列,否则除了原始SQL之外您将无能为力。


我一直都有这个问题。我的观点是我无法更改或不想更改,但我想要一个页面来显示复合信息(也许在管理部分中)。我只是覆盖保存并引发NotImplementedError:

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

(尽管在大多数情况下可能不需要这样做,但这使我感觉好些了)

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

1
2
    class Meta:
       managed = False

然后,我只选择任何字段并将其标记为主键。这是否真的与您无关紧要,只不过是在页面上显示信息等过滤器而已。

似乎对我来说很好。如果我忽略了此技术的任何问题,请表示赞赏。


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

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


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

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

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