按字母顺序排序,但首先是所有活动实例,最后是非活动实例

时间:2015-10-22 20:32:28

标签: django django-models django-queryset

我有一些我希望按字母顺序过滤的实例。但是,非活动实例(instance.inactive)应该在最后。

我怎样才能做到这一点?

编辑: 在我的模型中,我有一个属性来获取上一个和下一个:

@property
def previous(self):
    '''
    Return the previous
    '''
    qs = self.__class__.objects.filter(name__lt=self.name).order_by('-name')[:1]
    if qs:
        return qs[0]
    else: 
        return None

现在我想找到下一个和上一个,但最后找到非活动的'

3 个答案:

答案 0 :(得分:3)

您应该可以通过为此模型的Meta类提供排序参数来实现。我认为这样的事情应该有效:

class Meta:
    ordering = ['title', 'inactive']

或者您可以将它传递给order_by queryset方法。

YourModel.objects.order_by('title', 'inactive')

('title'是您用于字母过滤的字段)

答案 1 :(得分:2)

好的,这就是我现在解决的问题。我认为只用一个查询就可以了,但可能不会:

    qs = self.__class__.objects.filter(name__lt=self.name, user_active=self.user_active).order_by('-name')[:1]
    if qs:
        return qs[0]
    else:
        switched_user_active = not self.user_active
        qs = self.__class__.objects.filter(user_active=switched_user_active).order_by('-name')[:1]
        return qs[0] if qs else None   

感谢答案,因为那些人​​指出了正确的方向!

答案 2 :(得分:1)

显示您模型的一些代码。

假设模型被称为实例,它有一个名为status的字段。您希望通过名为“name”的另一个字段对实例进行排序。

qs = Instance.objects.exclude(status='inactive').order_by('name') | Instance.objects.filter(status='inactive')

解决这个问题的另一种方法是了解Case在Whens时的工作原理。这是文档的链接。 https://docs.djangoproject.com/en/dev/ref/models/conditional-expressions/#case