首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django在与外键对象相关的组内排序

Django在与外键对象相关的组内排序
EN

Stack Overflow用户
提问于 2018-12-21 09:07:29
回答 1查看 418关注 0票数 2

我有一个模型:

代码语言:javascript
复制
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)

我想按山对攀登进行分组,并按最后一次攀登对山进行排序,也可以对每一座山内的攀登进行排序。

代码语言:javascript
复制
Everest:
    2018-12-21
    2018-10-10
    2000-01-30

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

代码中也是如此:

代码语言:javascript
复制
(
    [
        'everest',
        ['2018-12-21', '2018-10-10', '2000-01-30']
    ],
    [
        'K2',
        ['2018-12-20', '2018-11-30']
    ]
)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-21 10:08:30

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

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

代码语言:javascript
复制
Climbing.objects.all().order_by('-date', 'mountain__name')

仅供参考,这是一个懒惰的查询,甚至不会命中数据库(所以效率应该不是问题),当你evaluate the Queryset时,你会得到数据。

更新

试着这样做:

更新模型,如下所示:

代码语言:javascript
复制
    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_related获取相关对象。(docs)

代码语言:javascript
复制
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

要按最新的登山日期排序,请尝试如下所示:

代码语言:javascript
复制
mountains = Mountain.objects.all().prefetch_related(prefetch).annotate(max_date=Max('climbings__date').order_by('max_date')
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53878003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档