Задать вопрос
  • Как проверить сортировку комментариев от старых к новым в Pytest?

    Seletach
    @Seletach Автор вопроса
    Начинающий бекендер
    Итак, ответ на мой вопрос. Фикстура и сам тест были неправильными.
    Вот правильный тест:

    def test_comments_order(client, a_lot_of_comments, url_detail):
        """Проверка сортировки комментариев от старых к новым."""
        response = client.get(url_detail)
        response.context['news']
        all_comments = [comment.created for comment in Comment.objects.all()]
        sorted_dates = sorted(all_comments, reverse=False)
        assert all_comments == sorted_dates

    Но этот тест не будет работать без правильной фикстуры:

    @pytest.fixture
    def a_lot_of_comments(news, author):
        now = datetime.now()
        for i in range(10):
            comment = Comment.objects.create(
                text=f'Текст комметария {i}',
                author=author,
                news_id=news.id,
            )
            comment.created = now + timedelta(days=i)
            comment.save()

    В фикстуре возвращать что либо или добавлять в список каждый комментарий не нужно, достаточно заполнить БД вписав фикстуру в параметры функции.

    А затем достать всё объекты из временной БД Comment.objects.all() и перебрав комменты по дате создания, засунуть их в список all_comments . Далее сравниваем этот список с отсортированным как нам надо списком, они должны быть одинаковы.
    Ответ написан
    Комментировать
  • Как посчитать количество комментариев под постом с помощью annotate()?

    Seletach
    @Seletach Автор вопроса
    Начинающий бекендер
    Вот решение этой задачи:
    class PostListView(ListView):
    '''Список постов'''
        model = Post
        template_name = 'blog/index.html'
        ordering = 'pub_date'
        paginate_by = 10
    
        def get_queryset(self):
            return super().get_queryset().filter(
                category__is_published=True,
                is_published=True,
                pub_date__lte = timezone.now()
                ).annotate(comment_count=Count("comments"))

    С помощью get_queryset достаём из модели Post все посты, далее фильтруем посты (посты и их категория должны быть опубликованы) и добавляем аннотацию, которая считает комментарии в этих постах.
    Ответ написан
    Комментировать
  • Как сделать так чтобы CBV-функция DetailView в Django принимала объект по slug?

    Seletach
    @Seletach Автор вопроса
    Начинающий бекендер
    Я понял что нужно написать,
    slug_url_kwarg = 'username' - так как в запросе slug "кастомный", и его нужно явно указать
    slug_field='username' - так как в БД поле slug тоже называется username
    Спасибо за наводку, datka
    Ответ написан
    Комментировать