Упорядочение Django по полю внешнего ключа

#django #python-3.x #django-models

#django #python-3.x #django-модели

Вопрос:

У меня есть две модели, перечисленные ниже:

 class Project(models.Model):
    name = models.TexField()

class Item(models.Model):
    project = models.ForeignKey(Project,on_delete=models.CASCADE, related_name='project_item')
    name = models.TextField()
    available = models.FloatField()
  

Итак, мне нужно получить все проекты, однако я хочу, чтобы они были такими, чтобы все те проекты, в которых есть элементы, которые available больше 0 , должны быть первыми.

Я пробовал это:

 list = Projects.objects.filter(**Some Fields**).order_by(available)
  

Как я могу отсортировать этот список?

Ответ №1:

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

 list = Projects.objects.filter(**Some Fields**).order_by('-item__available')
  

Это упорядочивает проекты в порядке убывания по доступному полю связанных элементов.

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

1. Пожалуйста, покажите вашу полную, актуальную модель. Очевидно, что вам не хватает некоторых атрибутов в опубликованном вами коде, например, для внешнего ключа требуется on_delete атрибут; вы также пропустили related_name ?

2. В этом случае вы можете выполнить сортировку с помощью order_by(‘-project_item__available’)

3. Это вызвало репликацию данных, как я могу добавить отдельное предложение, на самом деле я новичок в Django, переходящий с Java.

4. @Paras просто добавьте distinct() в конец следующим образом: list = Projects.objects.filter( Некоторые поля ).order_by(‘-item__available’).distinct()

5. distinct() здесь бесполезно, поскольку строки, возвращаемые SQL-запросом, технически не являются дубликатами, поскольку они включают уникальные связанные поля, используемые для упорядочивания. Смотрите примечание под distinct() в документах Django.