2017-04-19 86 views
0

我有这样一个观点:Django的:为了一个QuerySet

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) 

和结果是一个QuerySet,看起来像这样:

set([(<thing: sfd>, 1), (<thing: quality>, 0), (<thing: hello>, -1), (<thing: hey>, 4), (<thing: test>, 0) 

我现在想订购由该组给定的值,所以它的名单以最高价值开始,但是当我做newSet.order_by/filter/split/join 它从'set' object has no attribute join/filter/split不工作。

任何人都可以给我一个提示如何排序querySet我找不到有用的东西我自己。

我需要这个在视图中工作,所以它不能/不应该在模型中完成。感谢您的任何建议。

+0

套件未订购。你为什么使用一个?为什么不列出? –

回答

1

结果是一个QuerySet它看起来像这样

其实这是一个set(蟒蛇内建类型),而不是一个QuerySet(Django的ORM型)。

set是一种无序的集合类型。要“排序”,你首先必须将它变成list - 这实际上很简单,如newlist = list(newset), 然后你可以用newlist.sort()就地排序列表。既然你想成为它的项目第二要素排序的这份名单中,你需要使用key参数告诉sort你要排序的内容:

newlist.sort(key=lambda item: item[1]) 

或者你可以改变你的score()功能存储(score, obj)元组,而在这种情况下,list.sort()自然会做RightThing(它会对你的元组进行排序)。

虽然我们在这:不要叫newSet.update()与单个项目的列表,你可以只使用newSet.add()代替,即:

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在所有这里 ?为什么不从一开始就使用list

+0

感谢它解决了“newlist = list(newset)”。我尝试从newSet = list()和newSet.add([(thing,Val)])位开始,我得到了与list()没有属性“add”相同的失败消息。 – Marla

+0

当然......一个'list'不是'set',所以API是不一样的。你要找的是'list.append()'(你也许想花几个小时学习使用基本的Python数据类型,这可能会节省相当长的一段时间)。 –

1

我想你可能在这里有一个集合,一个列表和一个QuerySet有点混淆?一个集合是无序的,而一个列表不是。集合不公开上面列出的方法(filter,order_by,split,join)。 QuerySet是一个Django特有的类,它有许多有用的方法。

我认为这将是简单的方式,newSet元组的列表,然后使用list.sort(key=lambda x: x[1])value下令名单。

如果val的计算是符合它虽然,我推荐使用annotate,然后废除newDictnewSet,并简单地传回的物品查询集,这将是更简单,更快的可能,并订购通过使用articles.order_by('value')。如果你发布val的计算,我会试着告诉你这是否可行。

+0

是的你是对的我完全错过了差异。我开始阅读有关集合,列表和QuerySets之间的区别。感谢您指出了这一点。并感谢评论我真的很感谢你的支持:) – Marla