Django:如何使用 ORM 连接没有外键的列

err*_*ona 6 python mysql django django-models

我 \xc2\xb4m 是 Django 和 Python 的新手,我可以 \xc2\xb4t 得到这个问题的解决方案,所以任何帮助都是值得赞赏的!

\n\n

I\xc2\xb4m 尝试连接 Django 中的数据库列,这些列确实有相应的值,但该值不是外键。

\n\n

让\xc2\xb4s 说我的模型是:

\n\n
class Order(models.Model):\n   order_id = models.AutoField(primary_key=True)\n   oOrder_number = models.CharField(max_length=50)\n   ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
class Shipment(models.Model):\n  dShipment_id = models.AutoField(primary_key=True)\n  dTo_order = models.CharField(max_length=10)\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我所知道的是,我可以使用 Djangoselect_related命令从与外键连接的表中获取值。

\n\n

但这是我的问题:我不能在我的模型中使用外键,其原因源于通过我的 API 推送数据的第三方软件。该软件无法存储所创建订单的返回值并将其用作发货的标识符(...)。

\n\n

所以最后这是我的问题:是否可以对相同的字段oOrder_number和进行一些连接dTo_order

\n\n

我想要的结果是,我可以选择某个订单并从 Shipment 表中获取所有连接的货件,这些货件都具有相同的 dTo_order。

\n\n

我知道如何在 Larvel 和 MySQL Querie 中执行此操作,但据我所知,\xc2\xb4s 不是“Djangoish”来使用原始查询...。

\n\n

对此有什么想法吗?

\n\n

谢谢阅读!如果我遗漏了一些内容,我将很乐意提供所有必要的信息!:)

\n\n

编辑:我知道我可以尝试一种解决方法,通过在订单表中搜索 To_order 字段并获取其主键来获取发货订单的外部。不过我很好奇 Django 中是否有更优雅的解决方案。

\n\n

更新:

\n\n

这是我的想象。

\n\n
    \n
  • 我像从数据库中获取订单orders=Order.objects.all()
  • \n
  • 我做了一些魔法,这样对于每个订单对象,都会有一个数组或其他包含属于该订单的所有发货数据的数组
  • \n
  • 我将数据传递到我的模板。在这里我想做类似的事情:

    \n\n

    {% 表示订单中的订单 %}

    \n\n

    {{订单.o订单号}}

    \n\n

    {订单中发货的%.shipments %}

    \n\n

    {{shipment.trackingno}}

    \n\n

    {% 结束 %}

    \n\n

    {% 结束 %}

  • \n
\n

blh*_*ing 6

您可以使用以下Subquery表达式OuterRef

from django.db.models import OuterRef, Subquery
shipments = Shipment.objects.filter(dTo_order=OuterRef('oOrder_number'))
Order.objects.annotate(shipments=Subquery(shipments.values('dShipment_id', 'trackingno')))
Run Code Online (Sandbox Code Playgroud)

  • 这个例子有效吗?`django.db.utils.ProgrammingError:子查询必须仅返回一列` (3认同)