ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

Python | Вопросы собесов

Python | Вопросы собесов

Открыть в Telegram

📈 Аналитический обзор Telegram-канала Python | Вопросы собесов

Канал Python | Вопросы собесов (@python_easy_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 12 637 подписчиков, занимая 9 918 место в категории Технологии и приложения и 51 142 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 12 637 подписчиков.

Согласно последним данным от 14 октября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -107, а за последние 24 часа — 0, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 6.11%. В первые 24 часа после публикации контент обычно набирает 4.23% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 772 просмотров. В течение первых суток публикация набирает 534 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 3.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, модуль, строка, docker, alice.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Благодаря высокой частоте обновлений (последние данные получены 15 октября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

12 637
Подписчики
Нет данных24 часа
-307 дней
-10730 дней
Архив постов
🤔 Когда нельзя линеаризовать ? Это процесс определения порядка разрешения методов (Method Resolution Order, MRO), который используется для поиска методов и атрибутов в иерархии классов при множественном наследовании. 🚩Когда нельзя линеаризовать иерархию классов 🟠Несоответствие принципам C3-линеаризации Python использует алгоритм C3-линеаризации для определения MRO. Если иерархия классов не соответствует принципам C3-линеаризации, то линеаризация невозможна. 🟠Конфликтные зависимости Конфликты возникают, когда два или более родительских класса содержат методы или атрибуты с одинаковыми именами, и порядок их разрешения не может быть однозначно определён. 🟠Несовместимые суперклассы Если классы в иерархии имеют несовместимые или пересекающиеся зависимости, это может сделать линеаризацию невозможной.
class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass
🚩Как определяется Python использует C3-линеаризацию для определения порядка разрешения методов. Этот алгоритм соблюдает порядок наследования классов, учитывая при этом принципы монотонности и консистентности.
class A:
    def method(self):
        print("A")

class B(A):
    def method(self):
        print("B")

class C(A):
    def method(self):
        print("C")

class D(B, C):
    pass

d = D()
d.method()  # Вывод: B
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое HTTP и HTTPS? 1. HTTP (HyperText Transfer Protocol): протокол передачи данных между клиентом и сервером, передаёт данные в открытом виде. 2. HTTPS: расширение HTTP, использующее шифрование через SSL/TLS для защиты передаваемых данных. 3. HTTPS обеспечивает конфиденциальность, целостность данных и аутентификацию сервера. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое проблема наследования ? Наследование является мощным механизмом в ООП, но оно также может привести к ряду проблем, которые следует учитывать при проектировании и разработке программного обеспечения. Вот основные проблемы, связанные с наследованием: 🚩Основные проблемы 🟠Жёсткая связь (Tight Coupling) Классы-наследники зависят от родительских классов. Изменения в родительских классах могут потребовать изменений в классах-наследниках. Если метод в родительском классе изменяет свою сигнатуру или поведение, все классы-наследники должны быть проверены и, возможно, изменены. Решение: Использование композиции вместо наследования, когда это возможно. 🟠Проблема повторного использования (Fragile Base Class Problem) Изменения в базовом классе могут непредсказуемо повлиять на поведение классов-наследников. Добавление нового метода в базовый класс может конфликтовать с существующим методом в классе-наследнике. Решение: Ограничение изменений в базовом классе, тщательное проектирование и тестирование. 🟠Проблемы с множественным наследованием Может привести к конфликтам имен методов и атрибутов, а также к сложности разрешения порядка вызовов методов (MRO — Method Resolution Order). Если два родительских класса имеют методы с одинаковыми именами, класс-наследник может неясно указывать, какой метод использовать. Решение: Использование интерфейсов (в языках, поддерживающих интерфейсы) или композиций. В Python использовать миксины. 🟠Избыточность интерфейсов Классы-наследники наследуют все методы и атрибуты родительских классов, даже если они не нужны. Класс-наследник может быть перегружен ненужными методами и свойствами, которые ему не требуются. Решение: Использование композиции для включения только нужных функциональностей. 🟠Нарушение инкапсуляции Классы-наследники могут получить доступ к защищённым (protected) и приватным (private) членам родительского класса, что может нарушить инкапсуляцию. Класс-наследник может изменить состояние родительского класса, вызывая неожиданные побочные эффекты. Решение: Строгое следование принципам инкапсуляции, использование методов доступа (геттеров и сеттеров).
class A:
    def method(self):
        print("Method from class A")

class B:
    def method(self):
        print("Method from class B")

class C(A, B):
    pass

c = C()
c.method()  # Вывод: Method from class A (MRO выбрал метод из класса A)
🚩Решение проблем наследования 🟠Композиция вместо наследования Предлагает включение объектов других классов в качестве членов, предоставляя больше гибкости и меньшую связанность по сравнению с наследованием.
      class Engine:
       def start(self):
           print("Engine started")

   class Car:
       def __init__(self):
           self.engine = Engine()

       def start(self):
           self.engine.start()
           print("Car started")

   car = Car()
   car.start()
   
🟠Использование интерфейсов и абстрактных классов Могут помочь определить строгие контракты для классов-наследников без предоставления реализации. 🟠Миксины Это классы, которые предназначены для предоставления дополнительной функциональности через множественное наследование, но они не предназначены для инстанцирования напрямую. Ставь 👍 и забирай 📚 Базу знаний

🤔 Чем хорош FastAPI? 1. Высокая производительность: использует Starlette и Pydantic, обеспечивая быстрый отклик. 2. Асинхронность: поддерживает async/await для обработки множества запросов одновременно. 3. Автогенерация документации: автоматически создаёт OpenAPI-спецификации и Swagger UI. 4. Удобство валидации: встроенная поддержка проверки данных. Ставь 👍 и забирай 📚 Базу знаний

🤔 Расскажи о методах enter и exit ? Методы __enter__ и exit являются частью протокола менеджера контекста. Они позволяют объектам определять поведение в контексте оператора with. Эти методы обеспечивают безопасное и автоматическое управление ресурсами, такими как файлы, сетевые соединения и другие объекты, которые требуют явного открытия и закрытия. 🚩Протокол менеджера контекста 🟠__enter__(self) Выполняется в начале блока with и возвращает объект, который будет присвоен переменной, указанной после as. 🟠__exit__(self, exc_type, exc_value, traceback) Выполняется в конце блока with, независимо от того, произошло исключение или нет. Он используется для очистки и освобождения ресурсов.
class ManagedResource:
    def __enter__(self):
        print("Entering the context")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")
        if exc_type:
            print(f"Exception type: {exc_type}")
            print(f"Exception value: {exc_value}")
            print(f"Traceback: {traceback}")
        return True  # True указывает на то, что исключение было обработано

# Использование
with ManagedResource() as resource:
    print("Inside the context")

print("Outside the context")
Пример управления файлом с использованием менеджера контекста
class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
        if exc_type:
            print(f"Exception type: {exc_type}")
            print(f"Exception value: {exc_value}")
            print(f"Traceback: {traceback}")
        return True

# Использование
with FileManager("example.txt", "w") as f:
    f.write("Hello, World!")

print("File operation completed")
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как работает хеш-таблица? Хеш-таблица хранит данные в формате ключ-значение, используя хеш-функцию для быстрого доступа. 1. Хеш-функция преобразует ключ в индекс массива. 2. Если возникают коллизии (два ключа дают одинаковый хеш), используются методы разрешения коллизий, например, цепочки (chaining) или открытая адресация. 3. В среднем сложность доступа — O(1), но может быть хуже при большом количестве коллизий. Ставь 👍 и забирай 📚 Базу знаний

🤔 Расскажи о методах getitem и setitem и delitem? Методы getitem, setitem и delitem являются специальными методами, которые позволяют пользовательским объектам взаимодействовать с операциями получения, установки и удаления элементов по индексу или ключу. Эти методы обеспечивают интеграцию пользовательских классов с операциями индексирования, делая их поведение аналогичным встроенным типам данных, таким как списки и словари. 🚩Метод getitem Используется для получения значения элемента по индексу или ключу. Он вызывается, когда используется оператор индексирования (obj[key]).
class CustomList:
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return self.items[index]

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
print(my_list[2])  # Вывод: 3
🚩Метод titem и delit Используется для установки значения элемента по индексу или ключу. Он вызывается, когда используется оператор присваивания с индексированием (obj[key] = value).
class CustomList:
    def __init__(self, items):
        self.items = items

    def __setitem__(self, index, value):
        self.items[index] = value

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items)  # Вывод: [1, 2, 10, 4, 5]
🚩Метод delitem Используется для удаления элемента по индексу или ключу. Он вызывается, когда используется оператор удаления с индексированием (del obj[key]).
class CustomList:
    def __init__(self, items):
        self.items = items

    def __delitem__(self, index):
        del self.items[index]

# Использование
my_list = CustomList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items)  # Вывод: [1, 2, 4, 5]
Полный пример пользовательского класса
class CustomDict:
    def __init__(self):
        self.items = {}

    def __getitem__(self, key):
        return self.items[key]

    def __setitem__(self, key, value):
        self.items[key] = value

    def __delitem__(self, key):
        del self.items[key]

    def __repr__(self):
        return f"{self.items}"

# Использование
my_dict = CustomDict()
my_dict['a'] = 1
my_dict['b'] = 2
print(my_dict['a'])  # Вывод: 1
print(my_dict)       # Вывод: {'a': 1, 'b': 2}
del my_dict['a']
print(my_dict)       # Вывод: {'b': 2}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие инструменты для виртуального окружения используются? 1. venv: встроенный инструмент Python для создания изолированных окружений. 2. virtualenv: популярное расширение с дополнительными функциями для управления виртуальными окружениями. 3. conda: используется в научных вычислениях и анализе данных, управляет не только Python, но и библиотеками C/C++. 4. Poetry: создаёт и управляет зависимостями через автоматическое создание виртуальных окружений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое JWT? Это компактный, URL-безопасный способ представления заявок между двумя сторонами. JWT широко используется для аутентификации и авторизации в веб-приложениях. 🚩Основные характеристики 🟠Компактность JWT — это компактный формат, который легко передавать через URL, заголовки HTTP или внутри тела запроса. 🟠Самодостаточность JWT содержит всю необходимую информацию для проверки подлинности, что избавляет от необходимости обращаться к базе данных при каждом запросе. 🟠Безопасность JWT может быть подписан с использованием алгоритмов HMAC или RSA, что обеспечивает целостность и подлинность данных. 🚩Структура 🟠Header (Заголовок) Заголовок обычно содержит два поля Тип токена (typ), который для JWT равен "JWT". Алгоритм подписи (alg), например, HMAC SHA256 или RSA.
{
  "alg": "HS256",
  "typ": "JWT"
}
🟠Payload (Полезная нагрузка) Полезная нагрузка содержит набор заявок (claims). Заявки бывают трех типов: Registered claims (Зарегистрированные заявки): Зарезервированные ключи, такие как iss (issuer), exp (expiration time), sub (subject), и aud (audience). Public claims (Публичные заявки): Пользовательские ключи, определенные в спецификации IANA JSON Web Token Registry или согласованные между сторонами. Private claims (Частные заявки): Пользовательские ключи, уникальные для конкретного приложения.
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
🟠Signature (Подпись) Подпись создается путем кодирования заголовка и полезной нагрузки с использованием Base64URL и их объединения. Затем применяется алгоритм, указанный в заголовке, к объединенной строке с использованием секретного ключа.
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)
🚩Пример использования 1⃣Установка библиотеки
pip install pyjwt
2⃣Создание JWT
import jwt
import datetime

# Секретный ключ
secret_key = "your-256-bit-secret"

# Заголовок
header = {
    "alg": "HS256",
    "typ": "JWT"
}

# Полезная нагрузка
payload = {
    "sub": "1234567890",
    "name": "John Doe",
    "admin": True,
    "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30)  # Время истечения действия токена
}

# Создание JWT
token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header)
print(token)
3⃣Декодирование JWT
import jwt

# Секретный ключ
secret_key = "your-256-bit-secret"

# Декодирование JWT
try:
    decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
    print(decoded_payload)
except jwt.ExpiredSignatureError:
    print("Signature has expired")
except jwt.InvalidTokenError:
    print("Invalid token")
Ставь 👍 и забирай 📚 Базу знаний

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

🤔 Как работает хеш-таблица? Это структура данных, которая хранит пары ключ-значение и использует хеш-функцию для вычисления индекса. Хеширование: ключ преобразуется в числовое значение (хеш). Размещение: хеш определяет индекс, куда сохраняется значение. Коллизии: если два ключа имеют одинаковый хеш, используется метод разрешения коллизий (связанный список, открытая адресация). Хеш-таблицы обеспечивают быстрый доступ (O(1)) к данным при правильной реализации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи о методе call ? Метод __call__ является специальным методом, который позволяет экземплярам классов вести себя как функции. Если объект класса имеет данный метод, то этот объект можно вызывать, как если бы он был функцией. Это может быть полезно для создания объектов, которые действуют как замыкания, для реализации паттернов проектирования и других сценариев, требующих функциональности. 🚩Основное предназначение Позволяет объекту вести себя как функция. Он вызывается, когда экземпляр класса вызывается как функция.
class Counter:
    def __init__(self):
        self.count = 0

    def __call__(self):
        self.count += 1
        return self.count

# Использование
counter = Counter()
print(counter())  # Вывод: 1
print(counter())  # Вывод: 2
print(counter())  # Вывод: 3
🚩Применение метода 🟠Функциональные объекты Позволяет создавать объекты, которые можно вызывать как функции, что полезно для создания замыканий и функций высшего порядка. 🟠Кеширование Используется для реализации механизмов кеширования в классах, когда результат вычисления может быть закеширован и повторно использован. 🟠Паттерны проектирования: Полезен для реализации различных паттернов проектирования, таких как синглтон, декоратор и фабрика.
class Multiplier:
    def __init__(self, factor):
        self.factor = factor

    def __call__(self, value):
        return value * self.factor

# Использование
double = Multiplier(2)
triple = Multiplier(3)

print(double(5))  # Вывод: 10
print(triple(5))  # Вывод: 15
Пример кеширования
class CachedFibonacci:
    def __init__(self):
        self.cache = {}

    def __call__(self, n):
        if n in self.cache:
            return self.cache[n]
        if n <= 1:
            return n
        self.cache[n] = self(n - 1) + self(n - 2)
        return self.cache[n]

# Использование
fibonacci = CachedFibonacci()
print(fibonacci(10))  # Вывод: 55
print(fibonacci(15))  # Вывод: 610
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как реализован many-to-many? Связь many-to-many создаётся с помощью модели, которая автоматически генерирует промежуточную таблицу. Вы можете управлять этой таблицей напрямую или добавить её кастомизацию с помощью through. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое сокеты? Это механизм, который позволяет программам обмениваться данными по сети. Они являются одним из основных способов коммуникации между устройствами в сетях, таких как интернет или локальная сеть (LAN). Сокеты используются для реализации различных сетевых протоколов, таких как TCP (Transmission Control Protocol) и UDP (User Datagram Protocol). 🚩Основные характеристики 🟠Сетевые сокеты Сокеты используются для связи между двумя устройствами по сети, такие как клиент и сервер. 🟠Типы сокетов TCP-сокеты (стриминговые сокеты): Обеспечивают надежное, установочное соединение с проверкой целостности данных и управлением потоком. Пример использования — веб-серверы и клиенты. UDP-сокеты (датаграммные сокеты): Обеспечивают безустановочное соединение с меньшей задержкой, но без гарантии доставки данных. Пример использования — видеостриминг, игры в реальном времени. 🚩Пример использования сокетов в Python TCP-сокеты Сервер
import socket

# Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))

# Ожидание входящих соединений
server_socket.listen()

print('Сервер ожидает соединения...')

while True:
    # Принятие нового соединения
    client_socket, client_address = server_socket.accept()
    print(f'Подключение от {client_address}')
    
    # Получение данных от клиента
    data = client_socket.recv(1024).decode()
    print(f'Получено: {data}')
    
    # Отправка ответа клиенту
    client_socket.sendall('Hello, Client!'.encode())
    
    # Закрытие соединения
    client_socket.close()
Клиент
import socket

# Создание TCP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Подключение к серверу
client_socket.connect(('localhost', 12345))

# Отправка данных серверу
client_socket.sendall('Hello, Server!'.encode())

# Получение ответа от сервера
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')

# Закрытие соединения
client_socket.close()
UDP-сокеты Сервер
import socket

# Создание UDP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))

print('UDP сервер ожидает сообщений...')

while True:
    # Получение данных от клиента
    data, client_address = server_socket.recvfrom(1024)
    print(f'Получено от {client_address}: {data.decode()}')
    
    # Отправка ответа клиенту
    server_socket.sendto('Hello, Client!'.encode(), client_address)
Клиент
import socket

# Создание UDP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Отправка данных серверу
client_socket.sendto('Hello, Server!'.encode(), ('localhost', 12345))

# Получение ответа от сервера
data, server_address = client_socket.recvfrom(1024)
print(f'Получено: {data.decode()}')

# Закрытие сокета
client_socket.close()
🚩Плюсы и минусы ➕Гибкость Сокеты предоставляют низкоуровневый доступ к сетевым операциям, позволяя разрабатывать различные сетевые протоколы. ➕Надежность (TCP) Обеспечивают надежную передачу данных с управлением потоком и проверкой целостности. ➕Простота (UDP) Позволяют быстро передавать данные с минимальной задержкой. ➖Сложность реализации Работа с сокетами требует понимания сетевых протоколов и управления соединениями. ➖Отсутствие гарантий доставки (UDP) Данные могут теряться или приходить в неправильном порядке. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что означает, что querySet() ленивый? QuerySet в Django является ленивым, что означает, что запросы к базе данных выполняются только при необходимости (например, при итерации или вызове методов вроде .all() или .filter()). Это позволяет оптимизировать работу с данными и предотвращать лишние запросы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие есть варианты определения модели пользователя в Django? В Django существует несколько вариантов определения модели пользователя. По умолчанию Django предоставляет базовую модель пользователя, но если требуется кастомизация, можно создать свою модель пользователя. 🟠Использование стандартной модели пользователя (`User`) Django предоставляет стандартную модель пользователя через django.contrib.auth.models.User. Эта модель включает в себя все основные поля и методы для работы с пользователями.
from django.contrib.auth.models import User

# Создание нового пользователя
user = User.objects.create_user(username='john', password='password123')

# Аутентификация пользователя
from django.contrib.auth import authenticate, login

user = authenticate(username='john', password='password123')
if user is not None:
    login(request, user)
🚩Расширение стандартной модели пользователя с помощью `UserProfile` 1⃣Создание модели профиля пользователя
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)
    birth_date = models.DateField(null=True, blank=True)

# Сигналы для автоматического создания и сохранения профиля пользователя
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userprofile.save()
2⃣Использование профиля пользователя
# Получение и изменение профиля пользователя
user = User.objects.get(username='john')
profile = user.userprofile
profile.bio = "Hello, I'm John!"
profile.save()
3⃣Замена стандартной модели пользователя кастомной моделью (`CustomUser`) Если необходимо полностью изменить модель пользователя, можно создать кастомную модель пользователя и указать Django использовать её вместо стандартной.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('The Email field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        return self.create_user(email, password, **extra_fields)

class CustomUser(AbstractBaseUser):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.email
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое миграция? Это способ управления изменениями в структуре базы данных через код. Django генерирует файлы миграций на основе изменений в моделях, а затем применяет их к базе данных, синхронизируя её структуру с кодом. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего используется IntegerChoices? IntegerChoices в Django используется для создания выбора из ограниченного набора целочисленных значений для поля модели. Это полезно, когда вам нужно ограничить допустимые значения для поля модели определенными целыми числами, и при этом иметь удобные человекочитаемые названия для этих значений. 🚩Основные плюсы ➕Читаемость кода Значения выбора имеют человекочитаемые названия, что делает код более понятным. ➕Поддержка валидации Django автоматически проверяет, что значение поля соответствует одному из допустимых значений. ➕Удобство использования в админке В Django admin интерфейсе выпадающий список с человекочитаемыми названиями делает работу с данными удобнее. 🚩Пример использования 1⃣Создание класса IntegerChoices
from django.db import models

class Status(models.IntegerChoices):
    PENDING = 1, 'Pending'
    APPROVED = 2, 'Approved'
    REJECTED = 3, 'Rejected'
2⃣Использование IntegerChoices в модели
from django.db import models

class Application(models.Model):
    status = models.IntegerField(choices=Status.choices, default=Status.PENDING)
    name = models.CharField(max_length=100)
    submitted_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name} - {self.get_status_display()}"
3⃣Пример работы с моделью
# Создание новой записи
app = Application.objects.create(name='John Doe')

# Проверка статуса
print(app.status)  # 1
print(app.get_status_display())  # 'Pending'

# Изменение статуса
app.status = Status.APPROVED
app.save()

# Проверка обновленного статуса
print(app.status)  # 2
print(app.get_status_display())  # 'Approved'
🚩Дополнительные методы и атрибуты Вы можете добавлять дополнительные методы и атрибуты в класс выбора для расширенной функциональности.
from django.db import models

class Status(models.IntegerChoices):
    PENDING = 1, 'Pending'
    APPROVED = 2, 'Approved'
    REJECTED = 3, 'Rejected'

    @classmethod
    def get_choices(cls):
        return [(choice.value, choice.label) for choice in cls]

# Пример использования
print(Status.get_choices())  # [(1, 'Pending'), (2, 'Approved'), (3, 'Rejected')]
Использование в фильтрах и запросах
# Фильтрация записей по статусу
pending_apps = Application.objects.filter(status=Status.PENDING)
for app in pending_apps:
    print(app.name)

# Фильтрация записей по множеству статусов
approved_or_rejected_apps = Application.objects.filter(status__in=[Status.APPROVED, Status.REJECTED])
for app in approved_or_rejected_apps:
    print(app.name)
Ставь 👍 и забирай 📚 Базу знаний

🤔 Отличия rebase от merge? 1. merge: объединяет две ветки, создавая дополнительный коммит слияния, который сохраняет историю обеих веток. Это удобно для сохранения полного контекста изменений. 2. rebase: перемещает изменения текущей ветки поверх другой, переписывая историю. Это делает историю линейной и более чистой, но может привести к конфликтам и проблемам при совместной работе. merge используется для сохранения полной истории, а rebase — для её упрощения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое JSON? Это легковесный формат обмена данными, который легко читается и пишется человеком, а также легко парсится и генерируется машинами. JSON используется для передачи данных между клиентом и сервером, особенно в веб-приложениях. 🚩Основные характеристики 🟠Простота и легкость JSON простой и легкий для понимания, что делает его удобным для обмена данными. 🟠Является текстовым форматом JSON представлен в текстовом формате, что позволяет легко его читать и отлаживать. 🟠Язык-независимость Хотя JSON основан на подмножестве языка JavaScript, он поддерживается многими языками программирования, включая Python, Java, C#, PHP и другие. 🚩JSON состоит из двух основных структур 🟠Объекты Набор пар "ключ-значение", заключенный в фигурные скобки {}. Ключи должны быть строками, а значения могут быть различными типами данных. 🟠Массивы Упорядоченные списки значений, заключенные в квадратные скобки [].
{
    "name": "John Doe",
    "age": 30,
    "isStudent": false,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zip": "12345"
    }
}
🚩Типы данных 🟠Строки Последовательности символов, заключенные в двойные кавычки.
"name": "John Doe"    
🟠Числа Целые числа и числа с плавающей запятой.
"age": 30    
🟠Булевы значения true или false.
"isStudent": false    
🟠Массивы Упорядоченные списки значений.
"courses": ["Math", "Science", "History"]    
🟠Объекты Наборы пар "ключ-значение".
"address": {
    "street": "123 Main St",
    "city": "Anytown",
    "zip": "12345"
}    
🟠Null Значение null.
"middleName": null    
Преобразование Python объектов в JSON (сериализация)
import json

data = {
    "name": "John Doe",
    "age": 30,
    "isStudent": False,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zip": "12345"
    }
}

# Преобразование Python объекта в JSON строку
json_string = json.dumps(data, indent=4)
print(json_string)
Преобразование JSON в Python объекты (десериализация)
import json

json_string = '''
{
    "name": "John Doe",
    "age": 30,
    "isStudent": false,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zip": "12345"
    }
}
'''

# Преобразование JSON строки в Python объект
data = json.loads(json_string)
print(data)
print(data['name'])  # John Doe
🚩Пример чтения и записи JSON в файл Запись JSON в файл
import json

data = {
    "name": "John Doe",
    "age": 30,
    "isStudent": False,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zip": "12345"
    }
}

with open('data.json', 'w') as file:
    json.dump(data, file, indent=4)
Чтение JSON из файла
import json

with open('data.json', 'r') as file:
    data = json.load(file)
    print(data)
    print(data['name'])  # John Doe
Ставь 👍 и забирай 📚 Базу знаний