Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django:订购一个查询集_Python_Django - Fatal编程技术网

Python django:订购一个查询集

Python django:订购一个查询集,python,django,Python,Django,我有这样的看法: def profile (request): articles = Post.thing.all() newSet = set() def score(): for thing in articles: Val = some calculation... .... newSet.update([(thing,Val)]) score() c

我有这样的看法:

def profile (request):
    articles = Post.thing.all()
    newSet = set()
    def score():
        for thing in articles:
            Val = some calculation...
            ....
            newSet.update([(thing,Val)])      
    score()
    context = {
     'articles': articles.order_by('id'),
     'newSet':newSet,
    }
    return render(request,'my_profile/my_profile.html',context)
结果是一个查询集,如下所示:

set([(<thing: sfd>, 1), (<thing: quality>, 0), (<thing: hello>, -1), (<thing: hey>, 4), (<thing: test>, 0)
set([(,1),(,0),(,-1),(,4),(,0)
我现在尝试按给定值对集合进行排序,因此它是一个以最高值开始的列表,但是当我执行
newSet.order\u by/filter/split/join时
它不起作用,因为“set”对象没有属性join/filter/split

有谁能给我一个提示如何对查询进行排序吗?我自己找不到任何有用的东西

我需要在视图中解决此问题,这样就不能/不应该在模型中完成。谢谢您的建议

结果是一个查询集,如下所示

实际上,这是一个
set
(python内置类型),而不是
QuerySet
(django的orm类型)

set
是一种无序的集合类型。要对其进行“排序”,首先必须将其转换为一个
列表
——这实际上与
newlist=list(newset)
一样简单, 然后,您可以使用
newlist.sort()
对列表进行就地排序。由于您希望此列表按照其第二个元素的项目进行排序,因此需要使用
参数告诉
sort
您要排序的内容:

newlist.sort(key=lambda item: item[1])
或者您可以将
score()
函数改为存储
(score,obj)
元组,在这种情况下,
list.sort()
自然会做正确的事情(它会根据元组的第一项对元组进行排序)

当我们进行此操作时:您可以使用
newSet.add()
代替使用单个项目列表调用
newSet.update()
,即:

def score():
    for thing in articles:
        val = some calculation...
        ....
        newset.add((thing, val)) 
        # or if you don't want to specify a callback
        # for `list.sort()`:
        # newset.add((val, thing))
最后:你真的需要一个
集合
吗?为什么不从一开始就使用
列表

结果是一个查询集,如下所示

实际上,这是一个
set
(python内置类型),而不是
QuerySet
(django的orm类型)

set
是一种无序的集合类型。要对其进行“排序”,首先必须将其转换为一个
列表
——这实际上与
newlist=list(newset)
一样简单, 然后,您可以使用
newlist.sort()
对列表进行就地排序。由于您希望此列表按照其第二个元素的项目进行排序,因此需要使用
参数告诉
sort
您要排序的内容:

newlist.sort(key=lambda item: item[1])
或者您可以将
score()
函数改为存储
(score,obj)
元组,在这种情况下,
list.sort()
自然会做正确的事情(它会根据元组的第一项对元组进行排序)

当我们进行此操作时:您可以使用
newSet.add()
代替使用单个项目列表调用
newSet.update()
,即:

def score():
    for thing in articles:
        val = some calculation...
        ....
        newset.add((thing, val)) 
        # or if you don't want to specify a callback
        # for `list.sort()`:
        # newset.add((val, thing))

最后:你真的需要一个
集合吗?为什么不从一开始就使用
列表呢?

我想你在这里可能会对集合、列表和a有点混淆?集合是无序的,而列表不是。集合不公开上面列出的方法(筛选、排序、拆分、联接).A QuerySet是Django特有的类,它有许多有用的方法

我认为制作
newSet
一个元组列表,然后使用
list.sort(key=lambda x:x[1])
value
对该列表排序会更简单


但是,如果您对val的计算符合条件,我建议您先使用然后取消
newDict
newSet
,然后简单地传回文章的查询集,这将更简单,可能更快,并且可以通过使用
文章进行排序。排序依据('value'))
。如果您发布了
val
的计算,我会尝试告诉您这是否可行。

我想您可能会对集合、列表和?集合是无序的,而列表不是。集合不会公开上面列出的方法(筛选、排序、拆分、联接).A QuerySet是Django特有的类,它有许多有用的方法

我认为制作
newSet
一个元组列表,然后使用
list.sort(key=lambda x:x[1])
value
对该列表排序会更简单


但是,如果您对val的计算符合条件,我建议您先使用然后取消
newDict
newSet
,然后简单地传回文章的查询集,这将更简单,可能更快,并且可以通过使用
文章进行排序。排序依据('value'))
。如果你发布了
val
的计算,我会尝试告诉你这是否可行。

集合没有排序。你为什么要使用一个?为什么不使用列表?集合没有排序。你为什么要使用一个?为什么不使用列表?感谢“newlist=list(newset)”。我尝试从newset=list()和newset开始。添加([(thing,val)])bit我得到了相同的失败消息,list()没有属性“add”。当然,
list
不是
set
,所以API不一样。你要找的是
list.append()
(你可能还需要花几个小时学习使用基本的Python数据类型,这可能会节省很多时间)我试着从newset=list()和newset.add([(thing,Val)])开始。我得到了同样的失败消息,list()没有属性“add”。当然,
list
不是
集,所以API不一样。你要找的是
list.append()
(您可能还需要花几个小时学习使用基本的Python数据类型,这可能会节省很多时间)。是的,您是对的,我完全忽略了差异。我开始阅读集合、列表和查询集之间的差异。感谢您指出这一点。感谢您的评论,我非常感谢您的支持:)是的,你是对的,我完全忽略了差异。我开始阅读集合、列表和查询集之间的差异。谢谢你的指点