Skip to main content
 首页 » 编程设计

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

2024年08月14日44mayingbao

我有以下模型:

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 上进行计算?

顺便说一句,您可以使用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_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')