Можно использовать двойные подчеркивания (__
) для просмотра сквозных отношений (например, ForeignKey
s и т. Д.).
Так что здесь мы можем фильтровать как:
Story.objects.filter(
<b>author__following__follower=my_profile</b>
)
Таким образом, используя author
, мы получаем ссылку на Profile
автора, затем с following
мы смотрим на модель Follow
и, наконец, с follower
мы снова получаемссылка на Profile
(s): профиль (и) последователя (ей).
my_profile
, конечно, необходимо заменить объектом Profile
(профиль человека, который* follower
из author
s из Story
s, которые вы хотите получить).
Это сгенерирует запрос вроде:
SELECT s.*
FROM story AS s
JOIN follow AS f ON f.following_id = s.author_id
WHERE f.follower_id = 123
, где 123
isid
из my_profile
.
Если человек следует за другим человеком несколько раз (здесь это может произойти, поскольку вы не обязываете, чтобы кортежи follower, following
были уникальными в модели Follow
), тогда соответствующие Story
s будут получены , кратные раз.
Поэтому, вероятно, лучше добавить ограничение unique_together
в модель Follow
:
class Follow(models.Model):
following = models.ForeignKey(
'Profile',
on_delete=models.CASCADE,
related_name="following"
)
follower = models.ForeignKey(
'Profile',
on_delete=models.CASCADE,
related_name="follower"
)
follow_time = models.DateTimeField(auto_now=True)
class Meta:
<b>unique_together</b> = (<b>('following', 'follower')</b>, )
Может также стоить увидеть модель Follow
в качестве through
модели ManyToManyField
[Django-doc] .