Django:如何使用ORM

时间:2018-10-24 13:03:04

标签: python mysql django django-models

我是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)
  ...

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

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

所以最后这是我的问题:是否可以使用相同的字段oOrder_numberdTo_order进行连接?

我希望得到的结果是,我可以选择一个特定的Order并从Shipment表中获取所有关联的托运,这些托运都具有相同的dTo_order。

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

有什么想法吗?

感谢您的阅读!如果我遗漏了一些东西,我将很高兴提供所有必要的信息! :)

编辑:我知道我可以尝试一种变通办法,方法是在“订单”表中搜索“ To_order”字段并获取其主键,以获取装运订单的外部代码。但是我很好奇Django中是否有更优雅的解决方案。

更新:

这就是我的想象。

  • 我从数据库中获取订单,例如orders=Order.objects.all()
  • 我做了一些魔术,以便对于每个订单对象,将存在一个数组或属于该订单的所有货运数据。
  • 我将数据传递给模板。然后我想在这里做类似的事情:

    {订单中%的订单%}

    {{Order.oOrder_no}}

    {%为订单中的装运量。装运%}

    {{shipment.trackingno}}

    {%endfor%}

    {%endfor%}

1 个答案:

答案 0 :(得分:1)

您可以将Subquery expressionOuterRef一起使用:

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')))