我有一个模型:
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服务器上。
发布于 2018-12-21 10:08:30
我不明白为什么你要在Postgres上做计算,而Django通过ORM提供了有效的解决方案?
顺便说一句,你可以通过Django ORM使用order_by来获取数据:
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_related获取相关对象。(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')https://stackoverflow.com/questions/53878003
复制相似问题