Метод intersection

Метод intersection применяется к QuerySet и возвращает новый QuerySet, содержащий объекты, которые присутствуют во всех исходных QuerySet. Метод принимает на вход один или несколько QuerySet в качестве аргументов и выполняет операцию пересечения на уровне базы данных с использованием SQL оператора INTERSECT.

Важно отметить, что все QuerySet, участвующие в пересечении, должны быть одного типа модели. Метод возвращает новый QuerySet, который можно использовать для дальнейших операций фильтрации, сортировки и агрегации.

Синтаксис

pythonqueryset.intersection(other_queryset1, other_queryset2, ...)

Пример

Рассмотрим простой пример использования метода intersection для поиска статей, которые есть в двух разных выборках:

pythonfrom myapp.models import Article
from datetime import date

# Articles created in January 2025
january_articles = Article.objects.filter(
  created_at__month=1,
  created_at__year=2025
)

# Articles with "Python" in the title
python_articles = Article.objects.filter(
  title__icontains="Python"
)

# Intersection of both QuerySets
result = january_articles.intersection(python_articles)

for article in result:
  print(article.title)

Результат выполнения кода:

python"Python Basics for Beginners"
"Advanced Python Patterns"

Пример

Используем метод intersection с несколькими QuerySet для поиска статей, которые удовлетворяют всем условиям:

pythonfrom myapp.models import Article
from datetime import date, timedelta

# Articles published in 2025
year_2025 = Article.objects.filter(
  published_at__year=2025
)

# Articles with more than 1000 views
popular_articles = Article.objects.filter(
  views__gt=1000
)

# Articles with status 'published'
published = Article.objects.filter(
  status='published'
)

# Find articles that meet all three conditions
result = year_2025.intersection(popular_articles, published)

# Display the results
for article in result:
  print(f"Title: {article.title}, Views: {article.views}")

Результат выполнения кода:

python"Title: Django Optimization Guide, Views: 2500"
"Title: Python Design Patterns, Views: 1800"

Пример

Покажем, как метод intersection работает с цепочками методов и дальнейшей фильтрацией:

pythonfrom myapp.models import Article
from datetime import datetime

# Articles from the last 30 days
recent = Article.objects.filter(
  created_at__gte=datetime.now() - timedelta(days=30)
)

# Articles with comments
with_comments = Article.objects.annotate(
  comment_count=models.Count('comments')
).filter(comment_count__gt=0)

# Articles from specific category
category_articles = Article.objects.filter(
  category__name='Web Development'
)

# Find articles that are recent, have comments,
# belong to Web Development category, and are published
result = (recent.intersection(with_comments, category_articles)
      .filter(status='published')
      .order_by('-views')[:5])

# Display the results
for article in result:
  print(f"{article.title}: {article.views} views")

Результат выполнения кода:

python"React Performance Tips: 3200 views"
"Building Scalable APIs: 2100 views"
"Webpack Configuration Guide: 1500 views"
"CSS Grid Layout: 1200 views"
"JavaScript Async Patterns: 800 views"

Смотрите также

  • метод union,
    который объединяет QuerySet в один набор
  • метод difference,
    который возвращает элементы, присутствующие в первом QuerySet, но отсутствующие в других
  • метод filter,
    который фильтрует QuerySet по заданным условиям
  • метод exclude,
    который исключает записи из QuerySet