Набор запросов Django для получения каналов от следующих пользователей

#python #django #django-models #django-queryset

#питон #джанго #django-модели #django-набор запросов

Вопрос:

Я пытаюсь получить каналы от подписчиков, таких как 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)
 

не работает.

ниже приводится самоссылающееся ManyToManyField.

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

Есть ли какое-нибудь лучшее решение?

У меня есть еще одна проблема с подсчетом количества ManyToManyFields.

 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) amp; (Q(number_of_likes__gte=5) | Q(number_of_comments__gte=5))).order_by('created_date')[:5]
 

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

 models.Post.objects.filter(Q(channels__users=user) amp; (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')
 

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

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

2. @WillemVanOnsem Вы правы. Я изменил его на followers = models . ManyToManyField(‘self’, blank=True, related_name=’following’, symmetric=False) Тем не менее, это не меняет того факта, что я должен отфильтровывать людей, за которыми следует пользователь, используя creator__in=user.following.all()

3. вы можете просто отфильтровать понравившееся .filter(creator__followers=user) .

4. @WillemVanOnsem О, вы абсолютно правы! Спасибо!! Есть ли у вас какие-либо предложения по второму запросу в популярной функции?