使用__max查找相关模型来注释查询集

时间:2016-11-22 17:50:39

标签: django django-models

我正在使用Django 1.10。

我有几个看起来像的模型:

class Product(models.Model):
    name = models.CharField(max_length=255)
    ...


class TransitionLog(models.Model):
    TransitionStates =[
        ('state_one', _('State One')),
        ('state_two', _('State Two')),
        ('state_three', _('State Three'))
    ]
    product = models.ForeignKey(Product)
    transitioned_to = models.CharField(choices=TransitionStates, null=False, blank=False)
    transitioned_timestamp = models.DateTimeField(auto_now_add=True)

我想要做的是使用最新的过渡状态(Product transitioned_to字段注释TransitionLog QuerySet。最新状态将是最近的状态transitioned_timestamp

我通过以下方式完成了大部分工作:

Product.objects.annotate(latest_transition=Case(When(transitionlog__pk=Max('transitionlog__pk'), then='transitionlog__transitioned_to')))

但是我关注的是Max()仅查看pk并采用最高的pk,这对我的目的有用,但我宁愿做的是获取最新的transitioned_timestamp

问题是,在找到最新的时间戳后,我不确定如何在TransitionLog.pk上进行匹配。我知道我也可以通过单独获取日志并从那里进行连接来在两个查询中执行此操作,但我也想避免这样做。

有人可以建议一种方法,我可以通过单个查询中给定Product的时间戳转换日志获取最新信息吗?任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

我能想到的最好方法是反过来看每个产品的最新转换。然后,您的产品会通过转换来访问它们。

transitions = TransitionLog.objects.all().order_by('-transitioned_timestamp').distinct('product_id')
但是,有一件事可能是一个问题。您将不会拥有没有关联TrasitionLog个对象的产品。