Метод intersection
Метод intersection применяется к QuerySet и возвращает
новый QuerySet, содержащий объекты, которые присутствуют
во всех исходных QuerySet. Метод принимает на вход один
или несколько QuerySet в качестве аргументов и выполняет
операцию пересечения на уровне базы данных с использованием
SQL оператора INTERSECT.
Важно отметить, что все QuerySet, участвующие в пересечении,
должны быть одного типа модели. Метод возвращает новый
QuerySet, который можно использовать для дальнейших операций
фильтрации, сортировки и агрегации.
Синтаксис
queryset.intersection(other_queryset1, other_queryset2, ...)
Пример
Рассмотрим простой пример использования метода intersection
для поиска статей, которые есть в двух разных выборках:
from 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 Basics for Beginners"
"Advanced Python Patterns"
Пример
Используем метод intersection с несколькими QuerySet
для поиска статей, которые удовлетворяют всем условиям:
from 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}")
Результат выполнения кода:
"Title: Django Optimization Guide, Views: 2500"
"Title: Python Design Patterns, Views: 1800"
Пример
Покажем, как метод intersection работает с цепочками
методов и дальнейшей фильтрацией:
from 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")
Результат выполнения кода:
"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