Задать вопрос
  • Почему при запуске Dockerfile докер не видит manage.py?

    Seletach
    @Seletach Автор вопроса
    Начинающий бекендер
    CMD ["python", "foodgram/manage.py", "runserver", "0:8080"] - необходимо явно указать каталог с manage.py, так как Dockerfile находиться вне этого каталога
    Ответ написан
    Комментировать
  • Почему не получается получить токен rest_framework.authtoken на других пользователей, хотя на админа получаю?

    Seletach
    @Seletach Автор вопроса
    Начинающий бекендер
    Ответ на мой вопрос.
    Нужно было сохранять пароль при помощи функции .set_password(), вот такой код в сериалайзере:
    class CustomUserCreateSerializer(ModelSerializer):
    
       class Meta:
            model = CustomUser
            fields = ('email',
                      'username',
                      'first_name',
                      'last_name',
                      'password')
            extra_kwargs = { # указываем обязательные поля для заполнения
                'first_name': {'required': True},
                'last_name': {'required': True},
                'username': {'required': True}
            }
    
        def create(self, validated_data):
            user = CustomUser (
                email=validated_data['email'],
                username=validated_data['username'],
                first_name=validated_data['first_name'],
                last_name=validated_data['last_name']
            )
            user.set_password(password) # хэшируем пароль
            user.save() # сохраняем в БД
            return user

    После этого заработает получение токена. Но есть еще нюанс, если для авторизации в админке в модели используется email, то получение токена тоже нужно настроить по email, иначе будет та же ошибка:
    Невозможно войти с предоставленными учетными данными.
    Ответ написан
    Комментировать
  • Как проверить сортировку комментариев от старых к новым в 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
    Ответ написан
    Комментировать