Метод union

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

Синтаксис

pythonqueryset1.union(queryset2, queryset3, ..., all=False)

Пример

Давайте объединим две модели пользователей:

pythonfrom 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)

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

python{"name": "John", "age": 20}
{"name": "Mary", "age": 22}
{"name": "Peter", "age": 35}

Пример

Объединим QuerySet с сохранением всех записей, включая дубликаты:

pythonfrom 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())

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

python"Total articles count: 15"

Пример

Объединим несколько QuerySet с разными условиями фильтрации:

pythonfrom 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)

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

python{"name": "Laptop", "category": "electronics"}
{"name": "Python Book", "category": "books"}
{"name": "Desk", "category": "furniture"}

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

  • метод intersection,
    который возвращает общие элементы между QuerySet
  • метод difference,
    который возвращает элементы, присутствующие только в одном QuerySet
  • метод filter,
    который фильтрует QuerySet по заданным условиям
  • метод values,
    который возвращает QuerySet словарей с указанными полями