python - Django在与外键对象相关的组内排序
问题描述
我有以下模型:
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 服务器上进行所有计算。
解决方案
我不明白你为什么要在 Django 通过 ORM 提供有效解决方案的 Postgres 上进行计算?
顺便说一句,您可以通过 Django ORM使用order_by来获取数据:
Climbing.objects.all().order_by('-date', 'mountain__name')
仅供参考,它是一个惰性查询,甚至不会访问数据库(因此效率应该不是问题),并且在评估 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
获取相关对象。(文档)
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')
推荐阅读
- javascript - 使用 setState 在内部更新状态如何反应?
- javascript - 在javascript中同步获取图像宽度和高度
- file - 如何使用电子对话框选择文件夹或文件?
- javascript - React Hooks setState 的意外结果
- r - 编辑 ggplot 默认图例符号
- javascript - wkhtmltopdf中第一页和最后一页的不同边距
- python - 如何将一个表中的 id 插入到另一个表中?
- xml - xslt/XML 消除重复的属性值
- jquery - 自定义滚动事件
- swift - 以编程方式快速呈现一个新的视图控制器/以编程方式给一个类一个标识符