ordery_by不适用于Django中的布尔字段

时间:2020-11-05 15:21:04

标签: python django django-rest-framework

我正在运行查询,但是ordery_by不适用于布尔字段值。任何帮助将非常感激。谢谢。

models.py:

class ShopOffer(models.Model):
    offer_title = models.CharField(max_length=120)
    added_by = models.ForeignKey(ShopOwnerShopDetails, on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)

views.py:

queryset = ShopOffer.objects.filter(added_by__user_id=user).order_by('-is_active')

2 个答案:

答案 0 :(得分:1)

按如下所示进行更改,以将默认的false(0)设置为true(1)

queryset = ShopOffer.objects.filter(added_by__user_id=user).order_by(‘is_active’) 

答案 1 :(得分:1)

在您的数据库中,布尔字段很可能以TINYINT(或其他整数类型)存储。这意味着数字0代表False,数字1代表True。因此,当您像这样拨打ORM时:

ShopOffer.objects.filter(added_by__user_id=user).order_by('-is_active')

您的SQL查询包含以下部分:

ORDER BY shop_owner_shopoffer.is_active DESC

那是什么意思。这意味着整数字段的降序。因此,较大的数字将排在第一,较小的数字将排在第二。因此1值(True)将排在第一,0值将排在第二。因此,True将排在第一,False将排在第二。

因此,如果您想首先使用False值,则查询应类似于:

ShopOffer.objects.filter(added_by__user_id=user).order_by('is_active')

但是,这再次取决于您使用的RDBMS。我建议检查ShopOffer表的表的DDL代码-以查看is_active字段的类型。

UPDATE1

https://i.stack.imgur.com/sx1g4.png

是MySQL

UPDATE2

OP确认它是TINYINT字段