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.
有什么功能可以实现吗?
您可以按计算值排序,以防您真正想要在数据库级别上执行所有操作.这应该工作:
Product.objects.all().order_by(\
Case(When(price=0, then=Value(MAX_INT)), default=F('price')))
Run Code Online (Sandbox Code Playgroud)
MAX_INT=2147483647
32位有符号整数的值在哪里,这对所有Django支持的DB都是安全的.
以下可以工作,它不是最好的代码来实现,但对于你的特殊情况,我认为这是直接使用查询集的简单方法,否则你可以考虑在 Python 中实现它(排序或其他内置函数)
qs = Product.objects.exclude(price=0).order_by('-price') | Product.objects.filter(price=0)
Run Code Online (Sandbox Code Playgroud)