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

dmi*_*dmi 23 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()
Run Code Online (Sandbox Code Playgroud)

抓而呈现异常:(1054,"未知列'read_only_view.ID在'字段列表’")

没有主键,我可以在视图中看到的.有解决方法吗?

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

And*_*ker 19

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

我假设你的意思是这是一个遗留表,你不能添加或更改列?

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

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

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

  • 这并没有真正解决与db视图有关的问题,而不是表.您已将其中一个字段指定为django的pk,无论是否.你可以逃避这一点,因为永远不会通过ORM对关系进行任何插入/更新.有关此技术的更多信息,请参阅[David S的答案](http://stackoverflow.com/a/11594959/519015)及其对此的评论. (9认同)

Dav*_*d S 14

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

    def save(self, **kwargs):
        raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)

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

我还在Meta类中设置为False.

    class Meta:
       managed = False
Run Code Online (Sandbox Code Playgroud)

然后我只选择任何字段并将其标记为主键.如果它真的是独一无二的,你只是在网页上显示信息的过滤器等等并不重要.

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

  • 您可以将非唯一字段标记为只读访问的主键,但这会对`queryset.distinct().count()`和实例比较等内容产生影响.作为后者的解决方法,您可以在模型上重新定义`__eq __()`. (2认同)
  • 如果你想要一个 id,你可以对视图做的事情是使用 `row_number()` 函数(至少在 PostgreSQL 中)。`SELECT row_number() OVER (ORDER BY field ASC) AS id,` (2认同)