Django - 如何过滤检查外键属性的对象列表?

时间:2017-06-07 09:49:55

标签: python django django-queryset

首先抱歉我的英语不好。

我必须过滤查询但使用外键属性。我有一个WorkOrder模型,并有其他模型与订单移动。

这是模型

class OrderMovements(models.Model):
    workorder = models.ForeignKey(
            WorkOrder,
            verbose_name=_('order'),
        )
    status = models.IntegerField(
            choices=FULL_CHOICES,
            default=1,
            verbose_name=_('status'),
        )
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

就像你看到一个工单可以有很多动作一样,我需要做的查询集是一个查询,它将最后10个具有状态为3或4的OrderMovement的WorkOver包含在其中的任何一个动作中工作单。

我真的不知道如何做到这一点。

希望你能理解我。

谢谢!

2 个答案:

答案 0 :(得分:2)

像往常一样,你从你想要的模型开始,并通过双下划线跟踪关系。

WorkOrder.objects.order_by('-timestamp').filter(ordermovements__status__in=[3, 4])[:10]

答案 1 :(得分:1)

首先使用related_name轻松执行反向关系查找

class OrderMovements(models.Model):
    workorder = models.ForeignKey(
        WorkOrder,
        related_name='ordermovements',
        verbose_name=_('order'),
    )
    // rest code

然后,您可以查询工作订单并使用related_name进行反向关系过滤。

您还需要distinct以避免重复

您的查询应该是:

WorkOrder.objects.order_by('-timestamp').filter(
    ordermovements__status__in=[3, 4]).distinct('-timestamp')[:10]