Как получить все отдельные объекты родительского элемента, упорядоченные по некоторому полю в дочернем элементе в django? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть две модели Django, названные Категории и Item .В категории может быть много предметов. У модели предметов есть свойство is_available, которое может быть True или False.

class Categories(models.Model):
    name = models.TexField()
    **some other fields**

class Item(models.Model):
    project = models.ForeignKey(Categories,on_delete=models.CASCADE, related_name='category_item')
    name = models.TextField()
    is_available = models.BooleanField()

. Вот как я запрашиваю db:

all_cat = Categories.odjects.filter(**some_field**).order_by('-category_item__is_live').distinct()

Тем не менее, я все еще не получаю результаты удаленного анализа, я думаю, что здесь отлично работает для элементов, но не для категорий.

Я знаю точный запрос SQL, я могу сделать это с ним, но как я могу запроситьиспользуя django?

1 Ответ

1 голос
/ 19 марта 2019

Из Django Doc

Все поля, используемые в вызове order_by(), включены в столбцы SQL SELECT.Иногда это может привести к неожиданным результатам при использовании вместе с distinct().Если вы упорядочите по полям из связанной модели, эти поля будут добавлены в выбранные столбцы, и в противном случае дублирующиеся строки могут казаться отличными.Поскольку дополнительные столбцы не отображаются в возвращаемых результатах (они предназначены только для поддержки упорядочения), иногда кажется, что возвращаются нечеткие результаты.

Аналогично, если вы используете запрос values()чтобы ограничить выбранные столбцы, столбцы, используемые в любом order_by() (или порядке модели по умолчанию), все равно будут задействованы и могут повлиять на уникальность результатов.

Мораль здесь в том, что если вы используете distinct()будьте осторожны при заказе по связанным моделям.Аналогичным образом, при использовании distinct() и values() вместе, будьте осторожны при упорядочении по полям, не входящим в values().


Итак, попробуйте добавить '-category_item__is_live' в distinct() также как

all_cat = Categories.odjects.filter(**some_field **).order_by(
    '-category_item__is_live').distinct(<b>'-category_item__is_live'</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...