当前位置:  开发笔记 > 后端 > 正文

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

如何解决《Django:查询没有主键的只读视图》经验,为你挑选了2个好方法。

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

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

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

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

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

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


David S.. 14

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

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

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

我还在Meta类中设置为False.

    class Meta:
       managed = False

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

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



1> Andy Baker..:

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

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

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

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

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


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

2> David S..:

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

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

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

我还在Meta类中设置为False.

    class Meta:
       managed = False

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

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


您可以将非唯一字段标记为只读访问的主键,但这会对`queryset.distinct().count()`和实例比较等内容产生影响.作为后者的解决方法,您可以在模型上重新定义`__eq __()`.
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有