Django Queryset для получения каналов от следующих пользователей - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь получать новости от следующих пользователей, таких как Facebook, Instagram и Twitter. Я написал вид, чтобы показать каналы от следующих людей.

class Following(View):
    def get(self, request):
        user = request.user
        posts =  models.Post.objects.filter(creator__in=user.following.all()).order_by('created_date')[:5]

Я беспокоился, может ли это вызвать проблемы с производительностью из-за user.following.all (). Я не знаю почему

filter(creator=user.following)

не работает.

follow - это самообращающаяся ссылка ManyToManyField.

followers = models.ManyToManyField("self", blank=True)
following = models.ManyToManyField("self", blank=True)

Есть ли лучшее решение?

У меня есть другие проблемы с подсчетом количества полей ManyToMany.

class Popular(View):
    def get(self, request):
        user = request.user
        posts = models.Post.objects.annotate(number_of_likes=Count('likes'), number_of_comments=Count('comments')).filter(Q(channels__users=user) & (Q(number_of_likes__gte=5) | Q(number_of_comments__gte=5))).order_by('created_date')[:5]

Это так долго, потому что лайки__count и comments__count не работали. Единственный случай, который я нашел в интернете, который работал, это с использованием annotate (). Есть ли лучшее решение для этого? Я хочу отфильтровать посты, в которых есть каналы, на которые подписывается пользователь, и среди них я хочу показать только количество лайков или количество комментариев выше определенного диапазона. Почему это не работает?

models.Post.objects.filter(Q(channels__users=user) & (Q(likes__count__gte=5) | Q(comments__count__gte=5))).order_by('created_date')[:5]

class Comment(news_models.TimeStampedModel):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
class Like(news_models.TimeStampedModel):
    comment = models.ForeignKey(Comment, null=True, on_delete=models.CASCADE, related_name='likes')
class Channel(models.Model):
    name = models.CharField(max_length=100, blank=False, unique=True)
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='channels')
    posts = models.ManyToManyField(Post, related_name='channels')
...