按升序排序Django查询集,但最后使用0值项

Roa*_*oan 5 python sorting django django-orm django-queryset

我是python,django的新手.我想要做的是我将模型定义为具有两列的产品:名称和价格.

name    price
pen      20
paper    30
eraser   0
Run Code Online (Sandbox Code Playgroud)

我试图使用以下代码对它们进行排序:

Product.objects.all().order_by('-price')
Run Code Online (Sandbox Code Playgroud)

这会将值排序为 0,20,30.

型号代码是

class Product(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True)
    price = models.IntegerField('Price', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

我想要实现的是将其排序为 20,30,0添加0.

有什么功能可以实现吗?

Iva*_*van 7

您可以按计算值排序,以防您真正想要在数据库级别上执行所有操作.这应该工作:

Product.objects.all().order_by(\
        Case(When(price=0, then=Value(MAX_INT)), default=F('price')))
Run Code Online (Sandbox Code Playgroud)

MAX_INT=214748364732位有符号整数的值在哪里,这对所有Django支持的DB都是安全的.


Mou*_*nir 5

以下可以工作,它不是最好的代码来实现,但对于你的特殊情况,我认为这是直接使用查询集的简单方法,否则你可以考虑在 Python 中实现它(排序或其他内置函数)

qs = Product.objects.exclude(price=0).order_by('-price') | Product.objects.filter(price=0)
Run Code Online (Sandbox Code Playgroud)