Получить значения одним запросом Django
У меня есть две таблицы со связью многие ко многим и рекурсивной связью в таблице категории. Я могу получать по категории и её подкатегорям все продукты.
Мои модели:
class ProductCategory(MPTTModel):
"""категории продуктов"""
name = models.CharField(max_length=255)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
def __str__(self):
return self.name
class Product(models.Model):
"""Продукты"""
name = models.CharField(max_length=1024)
category = models.ManyToManyField(ProductCategory, related_name="category_related")
def __str__(self):
return self.name
Запрос, где получаю все товары относящиеся к конкретной категории и все товары относящиеся к дочерним категориям этой категории:
queryset = Product.objects.filter(category__in=ProductCategory.objects.get(id=456).get_descendants(include_self=True))
print(queryset.query)
Как мне сделать одним запросом вывод товаров одновременно несколько категорий? Я бы мог делать такой запрос для каждой необходимой категории, записывать в массив, удалять дубликаты и выдавать пользователю, но одновременно категорий может быть и 10 и 15. Не думаю что такой подход будет производительным, так как товаров может быть более 100 000 шт.
Я смог делать, то что мне нужно таким образом при помощи OR:
queryset = Product.objects.filter(category__in=ProductCategory.objects.get(id=456).get_descendants(include_self=True))\
|Product.objects.filter(category__in=ProductCategory.objects.get(id=454).get_descendants(include_self=True))
print(queryset)
Но не уверен, что это один запрос.