#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.