• Как реализовать хранение файлов в памяти, используя репозиторий?

    @alexanderzanin
    Никита, думаю суть вашей лабораторной довольно простая - понять, для чего вам интерфейс в DI. Допустим у вас есть один сервис, который работает с этим репозиторием, который сохраняет все на диск. Но допустим вам надо изменить репозиторий, чтобы он сохранял теперь в любое другое место. Если бы ваш репозиторий передавался в сервис через интерфейс, то тогда в сервис можно передать любой репозиторий, который реализует данный интерфейс. По сути, вы можете передать любой класс репозитория в сервис, если он реализует интерфейс - и приложение должно остаться работоспособным. В SOLID это объяснение есть.
  • Как реализовать хранение файлов в памяти, используя репозиторий?

    @alexanderzanin
    Чтобы понять, в чем может быть проблема с тестами, это надо подумать о разработке продукта в команде. Допустим ваш функционал - это часть общего приложения, которое пилит команда из нескольких человек. К вашему функционалу вы дописали тесты, но писали вы их на своей машине под реализацию - хранение файлов не в памяти. При запуске у вас все работает. Закидываем все на деплой, и во время деплоя начинается запуск тестов, которые уже не выполняются - так как тесты запускаются в другой среде, в другом контейнере докера, у другого разработчика (если он выкачал вашу ветку). А реализация по SOLID в этом случае требует интерфейсов, чтобы потом замокать интефейс репозитория и подменить своей реализацией, которая как раз и хранит файлы в памяти.
  • Как выбрать последнее по дате значение по группе строк?

    @alexanderzanin
    Сложно понять, как вы определяете самую свежую запись. К примеру, если у одного id есть в октябре 3 записи, все начинаются со 2 октября, но дальше у каждой записи вторая дата: 15, 16, 17 число соответственно. По логике, запись на 17 число - самая свежая из трёх. Если так, то запрос работает. Если не так, то какие ещё критерии, чтобы узнать самую свежую запись?
    Если надо самую свежую запись не за месяц, а за год, тогда запрос надо скорректировать.
  • Что наследуется в ООП? Как работает наследование?

    @alexanderzanin
    wideShift, потому что это никак не мешает функционалу. И private и protected для сокрытия внутренней реализации, просто protected в наследниках можно использовать под себя.
  • Что наследуется в ООП? Как работает наследование?

    @alexanderzanin
    wideShift, метод protected в классе Cat в данном случае становится бесполезным. Вы не можете после этого сделать так:
    $cat = new Cat();
    $cat->eat();
  • Ошибка ImportError: cannot import name ... most likely due to a circular import?

    @alexanderzanin
    Кажется происходит так: urls.py вызывает views.py, views.py вызывает forms.py, forms.py вызывает models.py, models.py вызывает views.py. Все по кругу
  • Ошибка ImportError: cannot import name ... most likely due to a circular import?

    @alexanderzanin
    Во views тоже есть импорт модели? Просто непонятно зачем в модели импорт views. Но даже, если это нужно, то может в этом проблема
  • Не могу перейти на страницу с одним постом из списка новостей?

    @alexanderzanin
    Указать название приложения в urls.py. После этого к News в шаблоне можно обращаться blog:News, а к post blog:post. То же самое уже в модели Post
    app_name = 'blog'
    
    urlpatterns = [
       path('news/', views.list_news, name='News'),
       path('post/<slug:post_slug>/', views.single_news, name='post')
    ]


    def get_absolute_url(self):
        return reverse('blog:post', args=[self.slug])


    В самом шаблоне в цикле идет new, а обращаетесь к post.
    Надо так:
    <a href="{{new.get_absolute_url}}" methods="post" >