python - Django 对与外键对象相关的组进行排序

标签 python django django-queryset

我有以下模型:

class Mountain(models.Model):
    name = CharField(max_length=200)

class Climbing(models.Model):
    mountain = models.ForeignKey(Mountain)
    climber = CharField(max_length=200)
    date = models.DateField(auto_now_add=True)

我想按山脉对攀登进行分组,并按上次攀登对山脉进行排序,以及对每座山脉内部的攀登进行排序。

Everest:
    2018-12-21
    2018-10-10
    2000-01-30

K2:
    2018-12-20
    2018-11-30

代码相同:

(
    [
        'everest',
        ['2018-12-21', '2018-10-10', '2000-01-30']
    ],
    [
        'K2',
        ['2018-12-20', '2018-11-30']
    ]
)

在 Django 中但在数据库方面实现它的最有效方法是什么?我知道我可以进行一组攀登,按相关山脉等进行过滤,但我想在 postgres 服务器上进行所有计算。

最佳答案

我不明白你为什么要在 Postgres 上进行计算,而 Django 通过 ORM 提供了高效的解决方案?

顺便说一句,您可以使用 order_by 来获取数据通过 Django ORM:

Climbing.objects.all().order_by('-date', 'mountain__name')

仅供引用,它是一个惰性查询,甚至不会访问数据库(因此效率应该不是问题),当您evaluate the Queryset时您将获得数据。 .

更新

尝试这样:

更新模型如下:

    class Mountain(models.Model):
        name = CharField(max_length=200)


    class Climbing(models.Model):
        mountain = models.ForeignKey(Mountain, related_name="climbings")  # <-- Here
        climber = CharField(max_length=200)
        date = models.DateField(auto_now_add=True)

        class Meta:
           ordering = ('-date',)  # <-- Here

然后使用prefetch_lated来获取相关对象。( docs )

from django.db.models import Prefetch

prefetch = Prefetch('climbings', Climbing.objects.all())

# OR
# prefetch = Prefetch('climbings', Climbing.objects.only('date'))

mountains = Mountain.objects.all().prefetch_related(prefetch).order_by('name')

for m in mountain:
    print(m.name)
    print(m.climbings.all().values_list('date', flat=True))

# Or
mountains.values('name', 'climbings__date')  # or user values_list if you want it as a list

更新2

要按最新攀爬日期排序,请尝试如下:

mountains = Mountain.objects.all().prefetch_related(prefetch).annotate(max_date=Max('climbings__date').order_by('max_date')

关于python - Django 对与外键对象相关的组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878003/

相关文章:

django - Sphinx Docs 不导入 Django 项目设置

python - Django 聚合 : Summation of Multiplication of two fields

python - 在 Django 中,如何优雅地将查询集过滤器添加到一个大组或一个对象的所有成员?

python - 提高列表连接的速度?

python - 匹配不需要的链接

Python nosetest 不起作用,但直接运行它可以使用 matplotlib 的 @image_comparison

sql - Django:如何有效地将 select_lated() 与 Paginator 一起使用?

python - 使用 matplotlib.pyplot (Python) 绘制椭圆

Django 管理内联表单,具有只读旧值并允许添加新的内联值

django prefetch_related id only