排序QuerySet取决于订购多对多字段

我有两个模型,其中一个包含许多领域。我想按升序对所有字段中的所有值进行排序。

My data and expected result - IMG

第一列是我的所有数据。第二列显示了使用多对多字段排序后的结果-将数据复制。第三列是预期结果-为了获得正确的结果,我将查询集转换为pandas数据框,并进行了所有排序以获得正确的结果。但是这种方法很慢。

是否有另一种方法可以根据需要订购数据。

models.py

class Publication(models.Model):
    title = models.CharField(max_length=30)

    class Meta:
        ordering = ('title',)

    def __str__(self):
        return self.title

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication,related_name = 'publications')

    def __str__(self):
        return self.headline

views.py -我用来获取正确结果的前两个功能。

from django.shortcuts import render
from .models import Article,Publication
import pandas as pd

def get_value_from_list(value,iter=0,sort_direct=True):
    try:
        value = value[iter]
    except IndexError:
        # value =  999999 if sort_direct == True else 0
        value = 0 
    return value

def get_unique_val(qs,sort_direct):
    df = pd.DataFrame(columns = ['id','headline','name','count'])

    for numb,item in enumerate(qs):
        df.loc[numb,'id'] = item.id
        df.loc[numb,'headline'] = item
        df.loc[numb,'name'] = item.publications.values_list('title',flat=True)
        df.loc[numb,'count'] = item.publications.count()

    max_val = df['count'].values.max()
    df = df.drop_duplicates(subset='id',keep="last")
    for i in range(0,max_val):
        df[f'col_{i}'] = df['name'].apply(lambda x: get_value_from_list(x,i,sort_direct))

    sort_by_col = [ f'col_{i}' for i in range(max_val) ]
    df2 = df.sort_values(sort_by_col,ascending=sort_direct)
    ids = df2['headline'].tolist()
    return ids

def index(request):
    df = Article.objects.all()
    ids_asc = get_unique_val(df,True)
    context = { 
        'asc': Article.objects.order_by('publications__title'),'desc': ids_asc,'full': Article.objects.all()
    }
    return render(request,'base.html',context = context) 

https://github.com/amyard/test_many 中,您可以使用这两个模型和视图克隆存储库,并使用图片数据克隆sqlite数据库。

happyboy_1 回答:排序QuerySet取决于订购多对多字段

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3163905.html

大家都在问