Ответ
В Django ORM для фильтрации и выполнения запросов через связанные модели используется синтаксис с двойным подчеркиванием (__). Это позволяет "переходить" по связям ForeignKey, ManyToManyField и OneToOneField прямо в методах filter(), exclude() и get().
Примеры использования:
Предположим, у нас есть следующие модели:
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')
tags = models.ManyToManyField(Tag)
-
Прямая связь (ForeignKey): Фильтрация
Articleпо полюnameсвязанной моделиAuthor.# Найти все статьи, написанные автором с именем 'John Doe' articles = Article.objects.filter(author__name='John Doe') -
Обратная связь (Reverse ForeignKey): Фильтрация
Authorпо полюtitleего статей. Для этого используетсяrelated_name(articles) или имя модели в нижнем регистре с суффиксом_set(article_set).# Найти всех авторов, у которых есть статьи со словом 'Django' в заголовке authors = Author.objects.filter(articles__title__icontains='Django') -
Связь Many-to-Many: Синтаксис аналогичен связям
ForeignKey.# Найти все статьи с тегом 'python' articles_with_python_tag = Article.objects.filter(tags__name='python') -
Цепочки связей: Можно строить длинные цепочки для доступа к полям через несколько моделей.
# Найти статьи автора, чей профиль указывает страну 'USA' # (при условии, что у Author есть OneToOneField к Profile с полем country) Article.objects.filter(author__profile__country='USA')
Этот механизм является одной из самых мощных возможностей Django ORM, позволяя строить сложные и выразительные запросы к базе данных.