我有一些我希望按字母顺序过滤的实例。但是,非活动实例(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
现在我想找到下一个和上一个,但最后找到非活动的'
答案 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