Метод union
Метод union применяется к QuerySet и возвращает новый QuerySet, содержащий уникальные записи, полученные в результате объединения нескольких исходных наборов данных. В качестве аргументов метод принимает один или несколько QuerySet, которые должны иметь одинаковую структуру полей. По умолчанию метод удаляет дубликаты, но это поведение можно изменить с помощью параметра all.
Синтаксис
queryset1.union(queryset2, queryset3, ..., all=False)
Пример
Давайте объединим две модели пользователей:
from myapp.models import User
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Teacher(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
# Get all students and teachers
students = Student.objects.all().values('name', 'age')
teachers = Teacher.objects.all().values('name', 'age')
# Union of students and teachers
res = students.union(teachers)
for person in res:
print(person)
Результат выполнения кода:
{"name": "John", "age": 20}
{"name": "Mary", "age": 22}
{"name": "Peter", "age": 35}
Пример
Объединим QuerySet с сохранением всех записей, включая дубликаты:
from myapp.models import Article
from django.db import models
# Get articles from two different queries
recent_articles = Article.objects.filter(created_at__year=2025)
popular_articles = Article.objects.filter(views__gt=100)
# Union with all duplicates
res = recent_articles.union(popular_articles, all=True)
print(res.count())
Результат выполнения кода:
"Total articles count: 15"
Пример
Объединим несколько QuerySet с разными условиями фильтрации:
from myapp.models import Product
from django.db import models
# Get products from different categories
electronics = Product.objects.filter(category='electronics')
books = Product.objects.filter(category='books')
furniture = Product.objects.filter(category='furniture')
# Union of all three categories
res = electronics.union(books, furniture)
for product in res.values('name', 'category'):
print(product)
Результат выполнения кода:
{"name": "Laptop", "category": "electronics"}
{"name": "Python Book", "category": "books"}
{"name": "Desk", "category": "furniture"}
Смотрите также
-
метод
intersection,
который возвращает общие элементы междуQuerySet -
метод
difference,
который возвращает элементы, присутствующие только в одномQuerySet -
метод
filter,
который фильтруетQuerySetпо заданным условиям -
метод
values,
который возвращаетQuerySetсловарей с указанными полями