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