• Чем Классы отличаются от обычных функций?

    RabraBabr
    @RabraBabr
    ООП это не управление сложностью как многие тут напишут. Это сущность другого уровня абстракции. Вы смешали в одну кучу сущности из разных уровней.
    Вот смотрите - в физическом мире есть микромир с электронами, протонами, фотонами и не знаю там чем еще. Он работает по своим законам квантовой механики. Есть макромир уровня вещей самолетов, яблок, деревьев. Он работает по законам Ньютоновской механики. Есть мир космогонии уровня звезд галактик черных дыр. Он работает по Теориям Эйнштейна. Видите как просто. Мы прошлись по трем уровням абстракции материального мира самого низкого до самого высокого.
    Так же и в мире информации есть самые низкие уровни машинных кодов, регистров и отдельных битов. А есть более высокие уровни функций, еще более высокие уровни классов и даже еще более высокие уровни абстракций. Так вот ваша задача рассортировать все те сущности, что вы привели правильно по разным уровням. А у вас все в одной куче: операторы, переменные, классы. И не надо высшему миру знать о низшем ничего. Тогда все будет правильно.
    Беда программирования в том, что очень мощные инструменты доступны всем. Вот представь мед лабораторию с микроскопами, скальпелями пробирками и другим оборудованием. Туда не каждого пустят. В программировании же каждый может нажать кнопку скачать и начать творить всякую фигню. Пришить пятую ногу собаке, вырастить ей ухо на спине и рога на лбу. Была такая книга - "Многоярусный мир". Там один товарищ специализировался на таких уродцах. Вот потом эти уродцы начинают мстить их создателю.
    Так вот нормальный программист попав в этот мир уродцев, зачастую впадает в ступор. Зачем так делать? Ну то есть делать можно все, что угодно. Но не нужно. Его задача уменьшать энтропию вселенной, а не увеличивать.
    Ответ написан
    3 комментария
  • Как грамотно сделать выборку данных из таблиц БД со связями в Django?

    Tanner
    @Tanner
    Огромный человекоподобный боевой робот
    Вы правильно поняли, для зависимых моделей в главной модели создаются RelatedManager'ы с именем ‘<зависимая_модель>_set’. Например, чтобы получить интересующие нас данные в консоли, мы можем сделать так:
    for project in Projects.objects.all():
        print('Title: ', project.title)
        print('Description: ', project.description)
        for preview in project.preview_set.all():
            print('\tImage title: ', preview.title)
            print('\tImage path: ', preview.image)

    Соответственно, чтобы вывести всё с помощью шаблонизатора, нам нужно переписать это на языке шаблонизатора:
    {% for project in project_list %}
        <h2>{{ project.title }}</h2>
        <p>{{ project.description }}</p>
        {% for preview in project.preview_set.all %}
        <h3>{{ preview.title }}</h3>
        <img src="{{ preview.image }}">
        {% endfor %}
    {% endfor %}

    Остаётся только передать модель в контекст шаблонизатора:
    def portfolio(arg):
        ctx = {
            'project_list': Project.objects.all(),
        }
        return render(arg, 'portfolio.html', ctx)

    С тегами всё аналогично, не стал усложнять ответ.
    Ответ написан
    1 комментарий