Django фильтрует объекты внешнего ключа из другой таблицы

#python #django #sqlite

#python #django #sqlite

Вопрос:

Две таблицы: post и рейтинг.

рейтинг содержит столбец — post (FK), который является основным идентификатором таблицы post. Я пытаюсь отфильтровать рейтинг таблицы по столбцам user и ratingtype, чтобы получить значение post (FK), по которому я мог бы использовать для фильтрации таблицы post.

 Post.objects.filter(pk__in=Rating.objects.get(post=post).filter(Rating.objects.filter(user = self.request.user, ratingtype='like')))
 

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

1. Итак, вы хотите, чтобы все Post объекты с лайком от данного пользователя?

2. Да, именно так.

Ответ №1:

Вы можете просматривать «сквозные» отношения с помощью двух последовательных символов подчеркивания ( __ ), поэтому:

 Post.objects.filter(
    rating__user=self.request.user,
    rating__ratingtype='like'
).distinct() 

Предложение .distinct() [Django-doc] предотвращает повторное повторение одного и того же Post несколько раз, если пользователь присвоил несколько оценок.

Если вы указали related_query_name=… [Django-doc] или related_name=… [Django-doc] в ForeignKey , то это имя отношения в обратном порядке, поэтому вместо rating__ него related_query_name__ (со related_query_name значением, которое вы использовали для related_query_name=… параметра).

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

1. не уверен, что я объяснил достаточно справедливо в своем посте. Мне нужно извлечь значение столбца «post» в таблице «рейтинг» по столбцам «user» и «ratingtype» и использовать значение для фильтрации таблицы Post.

2. @Augis: но позже вы собираетесь извлекать сами Post объекты? Тогда более эффективно и элегантно работать с JOIN s, и это то, что делают двойные подчеркивания.

3. @Augis: таким образом, вам не нужно извлекать значение столбца. Django может следовать отношениям в обратном порядке.

4. большое спасибо, потребовалось некоторое время, чтобы понять, что вы говорили, но вы правы, большое спасибо!