У меня есть модели с товаром и категорией.
Категория является внешним ключом продукта, и Категория также сама относится к подкатегориям.
чтобы получить набор запросов продуктов с категорией, имя которой содержит определенную строку, я думаю, что должен быть более умный способ, чем сделать это, как показано ниже
(product__category__parent__parent__parent ...... __name__icontains)
может кто-нибудь посоветует лучший способ? Спасибо
models.py
class Product(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True, null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
class Category(MPTTModel):
parent = TreeForeignKey('self', null=True, blank=True,
related_name='children', on_delete=models.CASCADE)
name = models.CharField(max_length=100, unique=True)
class MPTTMeta:
order_insertion_by= ['name']
def __str__(self):
return self.name
def trees(self):
ancestors = self.get_ancestors(ascending=False, include_self=True)
return ' | '.join(category.name for category in ancestors)
context_processor.py
def filter_category(request):
query = request.GET.get('fq', None)
if query is not None:
lookups = Q(category__name__icontains=query) | Q(category__parent__name__icontains=query)\
| Q(category__children__name__icontains=query) | Q(category__parent__parent__name__icontains=query)
results = Product.objects.select_related().filter(lookups)
else:
results = Product.objects.all()
context = {
'results': results
}
return context