Использование фильтра в списке
Я создаю приложение для блога и пытаюсь получить доступ к 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)