首页 > 解决方案 > Django:如何使用 ORM 连接没有外键的列

问题描述

我是 Django 和 Python 的新手,我无法解决这个问题,所以感谢您的帮助!

我正在尝试加入 Django 中的数据库列,这些列确实具有相应的值,但该值不是外键。

假设我的模型是:

class Order(models.Model):
   order_id = models.AutoField(primary_key=True)
   oOrder_number = models.CharField(max_length=50)
   ...

class Shipment(models.Model):
  dShipment_id = models.AutoField(primary_key=True)
  dTo_order = models.CharField(max_length=10)
  ...

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

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

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

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

我知道如何在 Larvel 和 MySQL 查询中做到这一点,但据我所知,使用原始查询并不是“Djangoish”......

有什么想法吗?

谢谢阅读!如果我遗漏了什么,我很乐意提供所有必要的信息!:)

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

更新:

这是我的想象。

标签: pythonmysqldjangodjango-models

解决方案


您可以使用以下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')))

推荐阅读