#python #django #django-rest-framework
#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')
Комментарии:
1. Выглядит хорошо, вы получаете какие-либо ошибки или сообщения?
2. Пожалуйста, определите «не работает» — как order_by не работает для вас? Вы получаете неправильный порядок?
3. @DmitryBelaventsev, я не получаю никаких ошибок. но я получаю активные и неактивные данные, даже если мой запрос предназначен только для неактивных данных.
4.
order_by
речь идет о сортировке — поэтому сначала вы получите ложные значения, а затем (после всех записей, где is_active=False) вы получите все записи, где is_active=True5. @DmitryBelaventsev да, это в
tinyint
поле. Я понял, почему «is_active» означает «False» из вашего ответа. Спасибо. действительно ценится.
Ответ №1:
Скорее всего, в вашей базе данных это логическое поле хранится как TINYINT (или другой целочисленный тип). Это означает, что number 0
будет представлять False, а number 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
придет вторым.
Поэтому, если вы хотите, чтобы на первом месте стояли ложные значения, ваш запрос должен быть таким:
ShopOffer.objects.filter(added_by__user_id=user).order_by('is_active')
Но опять же, все зависит от используемой вами СУБД. Я предлагаю проверить DDL-код таблицы для ShopOffer
таблицы — чтобы увидеть тип is_active
поля.
UPDATE1
https://i.stack.imgur.com/sx1g4.png
Это MySQL
UPDATE2
OP подтвердил, что это поле TINYINT
Ответ №2:
Измените его, как показано ниже, чтобы получить порядок по умолчанию false(0) на true(1)
queryset = ShopOffer.objects.filter(added_by__user_id=user).order_by(‘is_active’)
Комментарии:
1. почему я не должен использовать order_by для этого? Какая-либо конкретная причина? на самом деле мне нужно отсортировать эти данные по активен или нет.
2. какой-то фильтр?
3. фильтр изменяет количество получаемых записей; упорядочение (сортировка) предназначено только для сортировки отфильтрованного набора записей
4. На самом деле он получает обратные данные, означает сначала «True», затем «False».
5. Используя orderby, вы получаете все запросы, а затем все данные с true помещаются сверху, а false внизу или наоборот, в зависимости от того, используете ли вы ’-‘ или нет