2011-09-29 38 views
0

我有一个行蟒蛇:如何添加用于排序Django模型的异常?

streams = Stream.objects.filter(info__isnull = False)\ 
     .order_by('-score', 'info__title') 

我喂的是一个的RequestContext

c = RequestContext(request, { 
    'online_streams': streams.filter(online = True), 
    'offline_streams': streams.filter(online = False) 
}) 

它各种各样的表格〜50行通过自己的分数和标题。这很好,但有一排我想总是顶一下。简单地提取它并将其从上面的行中过滤出来,然后单独提供给RequestContext将不起作用,因为我不得不修改模板。此外,我可能会更改哪一行应该在最后,或者可能会改为多行。

是否有一个过滤器参数,我可以插入说行“东西排序所有行,除了行ID 8,应该永远是顶部”?或者我可以在过滤后手动更改QuerySet的顺序?

感谢您的任何建议

+0

修改模板有什么问题?你试图做一些破解,为什么不正确?所以任何看着你的代码的人(包括你)都会明白发生了什么,为什么。 – DrTyrsa

+0

当然,我不能在我的情况下更改模板。它的工作是显示它交给的行。有一行或多行卡在顶端是一个短暂的事情,它不会总是这样。每次改变时编辑模板都很愚蠢。 – Hubro

+0

编辑模板很愚蠢,编辑视图/模型/管理器不是很愚蠢?好。编辑视图和模板更容易,更快,更清晰。但是如果你有很多时间来发明奇怪的黑客,为什么不呢。 :-) – DrTyrsa

回答

0

我找不到一种方法来使用查询集来做到这一点,所以我最终将查询集转换为列表并使用魔术比较函数对其进行排序。它结束了看起来像这样:

神奇的分拣,检查应在“上面”卡名称:

# Comparison magic 
def __cmp__(self, other): 
    # On top 
    if self.name in stream_ontop: 
     return 1 
    if other.name in stream_ontop: 
     return -1 

    # Score 
    if self.score > other.score: 
     return 1 
    if self.score < other.score: 
     return -1 

    # Title alphabetical 
    if self.info.title > other.info.title: 
     return -1 
    if self.info.title < other.info.title: 
     return 1 

    return 0 

然后我拿来和整理他们这样从我的模型类

# Custom sorting 
@staticmethod 
def getAllSorted(online): 
    streams = list(Stream.objects.filter(online=online, info__isnull=False)) 
    streams.sort(key=None, reverse=True) 

    return streams 
0

您可以覆盖模型管理方法:

类MyManager(models.Manager):

def filter(self, *args, **kwargs): 
    return super(MyManager, self).filter(*args, **kwargs).exclude(id=8).order_by(...) 

然后在模型

class Stream(models.Model): 
    ... 
    objects = MyManager() 

编辑 要确保它包含在内,您可以查询:

from django.db.models import Q 
return super(MyManager, self).filter(Q(id=8) | Q(*args, **kwargs)).order_by(...) 
+0

我不确定它是否会按照你的方式工作。我只是想告诉你,可以更改原始过滤器 – szaman

+0

从我看到的代码中,你只是排除了id 8.你如何确保它包含在顶部? – Hubro