Каково назначение двойного подчеркивания (__) в Django

Ответ

В Django двойное подчеркивание (__) используется в двух ключевых, но совершенно разных контекстах:

1. Lookups в QuerySet API

Это основное, специфичное для Django применение. Двойное подчеркивание используется для построения сложных запросов к базе данных, разделяя имя поля и тип поиска (lookup) или для навигации по связанным моделям.

Основные случаи использования:

  • Переход по связанным моделям (Foreign Key, ManyToMany): Post.objects.filter(author__name='John Doe') — фильтрация постов по имени связанного автора.
  • Указание типа сравнения поля: Post.objects.filter(views__gte=1000)gte (greater than or equal) означает "больше или равно". User.objects.filter(email__icontains='@example.com')icontains означает "содержит без учета регистра".
  • Работа с датами и временем: Post.objects.filter(pub_date__year=2023) — фильтрация по году публикации.

Пример:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    views = models.PositiveIntegerField(default=0)

# Найти все посты автора с именем, начинающимся на 'John',
# и у которых более 1000 просмотров.
posts = Post.objects.filter(
    author__name__startswith='John',
    views__gte=1000
)

2. "Магические" методы Python (Dunder Methods)

Как и в стандартном Python, Django использует dunder-методы (double underscore) для определения специального поведения объектов. Это не является уникальной особенностью фреймворка.

Пример в модели Django:

class Post(models.Model):
    title = models.CharField(max_length=200)

    def __str__(self):
        # Определяет строковое представление объекта,
        # которое используется, например, в админ-панели Django.
        return self.title

Ответ 18+ 🔞

Давай разберёмся, что за хуйня с этими двумя подчёркиваниями в Джанго. Их используют в двух местах, и это две абсолютно разные истории, ёпта.

1. Поисковые запросы в QuerySet (То, за что все любят Джанго)

Вот тут двойное подчёркивание — это вообще пиздец какая удобная штука. Оно как бы говорит базе данных: «Эй, сука, слушай сюда, я сейчас буду навигировать по связям и делать сложные фильтры».

Что можно делать, блядь:

  • Лезть в связанные модели (по Foreign Key, например): Post.objects.filter(author__name='Вася Пупкин') — найди мне все посты, где у автора имя «Вася Пупкин». Прям вот так, через два подчёркивания, как будто ты идёшь по полям.
  • Уточнять, как именно сравнивать: Post.objects.filter(views__gte=1000)gte значит «больше или равно». То есть «покажи посты, у которых просмотров больше или равно 1000, а не просто равно, ты, деревянный». User.objects.filter(email__icontains='@gmail.com')icontains это «содержит, и похуй на регистр». Найдёт и test@gmail.com, и TEST@GMAIL.COM. Удобно, блядь.
  • Ковыряться в датах: Post.objects.filter(pub_date__year=2023) — отфильтруй по году. Не надо самому вытаскивать год из даты, Джанго всё сделает за тебя.

Вот тебе живой пример, чтобы не быть просто пиздаболом:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    views = models.PositiveIntegerField(default=0)

# Найдём все посты автора, чьё имя начинается на 'John',
# и у которых просмотров больше тысячи. Всё одним запросом, без этой вашей ебалы с циклами.
posts = Post.objects.filter(
    author__name__startswith='John',
    views__gte=1000
)

2. «Магические» методы Питона (Dunder Methods)

А вот это уже не специфика Джанго, а общепитоновская тема. Два подчёркивания в начале и в конце имени метода — это как знак «осторожно, магия!». Джанго их тоже использует, потому что он на Питоне написан, а не на палочках.

Самый частый гость в моделях:

class Post(models.Model):
    title = models.CharField(max_length=200)

    def __str__(self):
        # Этот метод определяет, как твой объект будет выглядеть,
        # когда его нужно показать человеку. Например, в админке Джанго.
        # Без него там будет какая-то хуйня вроде "Post object (1)".
        return self.title

Вот и вся разница, блядь. В первом случае — это язык запросов Джанго, его суперсила. Во втором — обычные питоновские приколы, которые просто живут внутри фреймворка. Главное — не перепутать, а то будешь как Герасим — «Муму-муму», а нихуя не выйдет.