Django: «упорядочивает» набор запросов на основе логического поля

#django

#django

Вопрос:

Я хочу получить все Menù экземпляры таким образом:

— вверху располагаются те экземпляры, для my_boolean_field которых установлено значение True

— на последних позициях те экземпляры, для которых my_boolean_field установлено значение False

Вот моя Menù модель и мой запрос:

 class Menù(models.Model):
    id_menù = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, unique=True)
    my_boolean_field = models.BooleanField(default=False)

# In my View:
my_query_set = Menù.objects.all().order_by('my_boolean_field')
  

Я также искал group_by опцию, но я ничего не нашел в Django ORM

Ответ №1:

вы можете добавить - в свой order_by запрос для сортировки в порядке убывания следующим образом:

 my_query_set = Menù.objects.all().order_by('-my_boolean_field')  # first get True ones then get False ones
  

другой способ — добавить ordering в вашу модель Meta класс следующим образом:

 class Menù(models.Model):
    id_menù = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, unique=True)
    my_boolean_field = models.BooleanField(default=False)

    class Meta:
        ordering = ('-my_boolean_field ',)
  

после этого изменения ваши запросы на my_boolean_field будут отсортированы по умолчанию и их не нужно будет использовать order_by('-my_boolean_field') :

 my_query_set = Menù.objects.all()  # results will be sorted by my_boolean_field in reverse order
  

Комментарии:

1. Вы также можете указать свойство Meta class ordering на случай, если оно должно быть упорядочено таким образом по умолчанию.