【问题标题】:Django Subquery ErrorDjango 子查询错误
【发布时间】:2016-02-23 07:08:46
【问题描述】:

我从 Django 1.4 迁移到 Django 1.8,现在我遇到了一个我不知道如何解决的问题。

当我跑步时:

dd_interface =  D_Interface.objects.filter(C_INTERFACE__iexact=interface.c_interface)[:1]
    campos = DD_Interface_Campos.objects.filter(dd_interface = dd_interface).order_by('SEQ')

我收到错误:

NotSupportedError(1235, "此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'"))

在 Django 1.4 中。在BD(MySQL)中执行的查询是:

选择dd_interface.id, dd_interface.dd_interface_id, ......来自dd_interface WHERE dd_interface.dd_interface_id = ( 选择 U0.iddd_interface_extendU0 在哪里 U0.C_INTERFACE LIKE 'ORACLE.1123.sdas' 限制 1) 由dd_interface.SEQ ASC 订购

在 Django 1.8 中使用了 MySql 5.X 不支持的“IN”子句。

选择 dd_interface.id, dd_interface.dd_interface_id, 从 dd_interface 在哪里 (dd_interface.dd_interface_id) 输入 ( 选择 U0.iddd_interface_extendU0 在哪里 U0.C_INTERFACE LIKE 'ORACLE.1123.sdas' 限制 1) 通过dd_interface.SEQASC 订购

我怎样才能解决这个问题? (对不起我的英语不好)

【问题讨论】:

  • filter(dd_interface=dd_interface) 没有意义,其中dd_interface 是查询集而不是模型实例。你为什么使用[:1]而不是[0](或者只是.get())?如果第一个查询没有返回任何项目,您希望发生什么?

标签: python mysql django django-1.8 django-1.4


【解决方案1】:

好吧,我开始研究 Django,在阅读文档时,我找到了一种使用 Manager.raw 执行原始查询的方法。

所以,基本上,我们可以这样做:

>>> foo_raw_queryset = Foo.objects.raw("select * from myapp_foo")
>>> foo_raw_query_set  # needs some list comprehension
<RawQuerySet: select * from myapp_foo>
>>> foo_list = [f for f in foo_raw_queryset] # will return a model object list
>>> foo_list
[<Foo: um>, <Foo: dois>]

因此,我不知道这是否是解决像您这样的问题的最佳解决方案,但您可以在不使用 IN 语句的情况下运行自定义查询,并避免您在 MySQL 中遇到的错误。

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多