Получение объектов модели, созданных разными пользователями в Django - PullRequest
1 голос
/ 26 февраля 2020

Я делаю простой канал, который состоит из записей, сделанных авторами, на которые подписан текущий пользователь. У меня есть 3 модели, которые являются моделью пользователя по умолчанию, моя модель "Post", которая связана с User через ForeignKey:

class Post(models.Model):
...
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
...

Модель "Relations", которая имеет 2 поля:

follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follows")
following = models.ForeignKey(User, on_delete=models.CASCADE, related_name="followed")

Поэтому я написал этот код для получения необходимых сообщений:

user = request.user
posts = Post.objects.filter(author__in = [relation.following_id for relation in user.follows.all()]).all()

И, честно говоря, он работает просто отлично, но есть ли способ улучшить мой запрос? Спасибо.

1 Ответ

0 голосов
/ 26 февраля 2020

Да, вы можете сделать JOIN в базе данных, поэтому:

Post.objects.filter(<b>author__followed__follower=user</b>)

или если вы хотите включить Post объекты, для которых user является author, вы можете работать с Q -объектов:

from django.db.models import Q

Post.objects.filter(<b>Q(author=user) | Q(author__followed__follower=user)</b>)

Поскольку вы выполняете JOIN на стороне базы данных, вы делаете это в одном запросе, тогда как понимание списка будет выполнено в 2 запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...