【问题标题】:Ordering by First Foreign Key in Django [duplicate]在Django中按第一个外键排序[重复]
【发布时间】:2019-05-12 07:35:57
【问题描述】:

考虑这两个简单的模型:

from django.db import models

class Foo( models.Model ):
  pass

class Bar( models.Model ):
  time = models.DateTimeField( auto_now_add=True )
  foo = models.ForeignKey(
    Foo,
    on_delete=models.CASCADE
    related_name='bars'
  )

如何通过第一个相关的Bar 对象订购Foo 对象?

Foo.objects.order_by('-bars.first__time')

【问题讨论】:

  • 定义“第一”。记录是无序的。也许你想要最小的 time
  • @WillemVanOnsem Model.some_related_objects.first() 那会做什么?
  • 它只返回数据库写入它的第一条记录,但该记录每次都可以不同。尤其是在更新/删除/插入之后,.first() 是另外一回事。 QuerySet 是有序的,因为数据库不能一次写入所有元素,但除此之外没有顺序。
  • @WillemVanOnsem 好的,在这种情况下,我想通过相关的 'Bar' 对象以最短的时间订购 Foo 对象。

标签: python django django-models foreign-keys


【解决方案1】:

鉴于“第一个”是具有“最旧”时间的Bar 对象,我们可以先.annotate(..) 我们的Foo 对象,然后按该最小值排序。因此,我们首先使用Min(..) 进行注释,然后使用该注释:

from django.db.models import Min

Foo.objects.annotate(
    min_time=Min('bars__time')
).order_by('-min_time')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2021-10-22
    • 2022-01-04
    相关资源
    最近更新 更多