ordery_by не работает для логического поля в Django

#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=True

5. @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 внизу или наоборот, в зависимости от того, используете ли вы ’-‘ или нет