Использование фильтра в списке

Я создаю приложение для блога и пытаюсь получить доступ к first posts of all the users в последнем 2 days, поэтому я использую решение для доступа к первым сообщениям.

когда я использую filter of last 2 days, метод первого сообщения не работает. Поэтому я подумал "I should use filter in another query"

models.py

class BlogPost(models.Model):
    user= models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, default='')
    body = models.CharField(max_length=30, default='')
    date = models.DateTimeField(auto_now_add=True)

views.py

def first_posts(request):
    time = timezone.now() - timedelta(days=2)

    posts = [user.blogpost_set.first() for user in User.objects.prefetch_related(
                                                          'blogpost_set')].filter(blogpost__date__gte=time)

    context = {'posts':posts}


Но он показал

у объекта 'list' нет атрибута 'filter'

  • Я также пробовал использовать :-

ALL_POSTS = []


for post in posts:
    ALL_POSTS.append(post).filter(post__date=time)

Но он показал

у объекта 'NoneType' нет атрибута 'filter

Я буду очень признателен за вашу помощь.

Спасибо

Во-первых, вы пытались отфильтровать список.

    time = timezone.now() - timedelta(days=2)

    posts = [user.blogpost_set.first() for user in User.objects.prefetch_related('blogpost_set')].filter(blogpost__date__gte=time)

    context = {'posts':posts} ```

Должно быть так,

posts = [user.blogpost_set.first() for user in User.objects.prefetch_related('blogpost_set').filter(blogpost__date__gte=time).order_by("blogpost__date")]

В этом запросе мы собрали пользователей, у которых есть записи в блоге, отфильтровали их по заданному времени и упорядочили по дате записи в блоге. Таким образом, это дает нам первый пост пользователей, у которых есть посты. (Пользователи без постов не включены)

Затем, во второй попытке метод list append возвращает None, таким образом, вы получаете эту ошибку:

у объекта 'NoneType' нет атрибута 'filter

Вы можете использовать запрос group by user в качестве подзапроса.

two_days_ago = timezone.now() - timedelta(days=2)

# get first blog_post_id user-wise in last two days
post_ids_subquery = BlogPost.objects.filter(
                            date__gt=two_days_ago
                        ).values(
                            'user'
                        ).annotate(
                            min_id=Min('id')
                        ).values('min_id')
# get objects for that blog_post_ids for accessing all fields of models
queryset = BlogPost.objects.filter(id__in=post_ids_subquery)
Вернуться на верх