Django упорядочение запросов по полям - PullRequest
0 голосов
/ 01 мая 2020

Я использую django 2, и в моем представлении списка я хочу, чтобы упорядочить набор запросов по полю likecount и datetime. Основная цель - зарезервировать пост с наибольшим количеством на сегодня. Мол, хочу показать самые понравившиеся посты за сегодня. Это похоже на топ-10 сегодняшних постов (чаще всего) . Я пробовал много способов, но не могу понять это. Я надеюсь, что вы, ребята, можете мне помочь.

Мои модели.py:

class post(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, blank=True, null=True)
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='post_pics', null=True, blank=True)
    content = models.TextField()
    likes = models.ManyToManyField(User, related_name='likes', blank=True)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    restrict_comments = models.BooleanField(default=False)
    watchlist = models.ManyToManyField(User, related_name='watchlist', blank=True)

    def __str__(self):
        return self.content

    class Meta:
        ordering = ['-date_posted', 'title']

    def get_absolute_url(self):
        return reverse ('blog-home')

    def total_likes(self):
        return self.likes.count()

Мои просмотры.py:

@login_required
def most_likes(request):
    posts = post.objects.annotate(like_count=Count('likes')).order_by('-like_count', '-date_posted')
    context = {'posts': posts}

    return render(request, 'blog/most_likes.html', context)

1 Ответ

0 голосов
/ 02 мая 2020

Если я вас правильно понял, вы уже упорядочиваете свой набор запросов по нужным полям (like_count и date_posted), но вам все еще не хватает части получения только результатов за желаемый период времени .

Если это так, то вам не хватает фильтрации набора запросов. Вам нужно что-то вроде этого (чтобы получить сообщения за последние 10 дней, упорядоченные по дате и количеству лайков):

import datetime as dt


@login_required
def most_likes(request):
    delta = dt.timedelta(days=10)
    posts = post.objects.filter(date_posted__gt=(dt.datetime.now() - delta)) \
        .annotate(like_count=Count('likes')).order_by('-like_count', '-date_posted')
    context = {'posts': posts}

    return render(request, 'blog/most_likes.html', context)

Теперь я попытаюсь передать значение нужного мне периода времени. хочу отфильтровать данные как параметр запроса, чтобы я мог сделать что-то вроде следующего:

delta = dt.timedelta(days=request.GET.get('days'))
...