【问题标题】:Annotate queryset with __max lookup of related model使用相关模型的 __max 查找注释查询集
【发布时间】:2016-11-22 17:50:39
【问题描述】:

我正在使用 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 QuerySet,即TransitionLog 的transitioned_to 字段。最新状态将是具有最新transitioned_timestamp 的状态。

通过执行以下操作,我已经实现了大部分目标:

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

但是我担心Max() 只查看 pk 并取最高的,这对我的目的有用,但我宁愿做的是获取最新的transitioned_timestamp。

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

谁能提出一种方法,让我可以在单个查询中获取给定Product 的最新时间戳转换日志?任何帮助,将不胜感激。谢谢!

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我能想到的最佳方法是反过来看,获取每种产品的最新过渡。然后,您的产品将通过转换访问它们。

    transitions = TransitionLog.objects.all().order_by('-transitioned_timestamp').distinct('product_id')
    

    不过,有一点可能是个问题。您不会拥有没有关联 TrasitionLog 对象的产品。

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 2020-11-14
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多