Как использовать Exists и OuterRef в prefetch_related в Django?

У меня есть 3 модели и мне нужно отобразить область и нужные товары только в том случае, если есть хотя бы 1 подключенный товар. Если в определенных моделях Area и Need нет товаров, то они не должны появляться в моем HTML файле.

Я проверил документацию и несколько ответов, связанных с этой темой, но я не могу реализовать это в моем скрипте.

Я также пытался создать свой собственный фильтр, чтобы я мог применить его непосредственно в моем шаблоне, но ничего не получилось.

Моя проблема в том, что я получаю список всех элементов из модели Need и не знаю, как исключить пустые элементы из HTML страницы.

Буду благодарен за любую помощь.

models.py

class Area(models.Model):
    title = models.CharField(max_length=75, blank=False)
    body = models.CharField(max_length=150, default='-', blank=False)
    publish = models.DateTimeField('publish', default=timezone.now)   

class Need(models.Model):
    title = models.CharField(max_length=75, blank=False, null=False, help_text='max 75 characters')
    body = models.CharField(max_length=150, default='-', blank=False)
    publish = models.DateTimeField(default=timezone.now)
    need_area = models.ForeignKey(Area, on_delete=models.CASCADE, related_name='need_area')

class ProductCategory(models.Model):
    title = models.CharField(max_length=400, blank=False, null=False, help_text='max 400 characters')
    body = models.TextField(default='-')
    publish = models.DateTimeField('publish', default=timezone.now)
    category_area = models.ForeignKey(Area, on_delete=models.CASCADE, related_name='category_area', null=True)
    category_need = models.ForeignKey(Need, on_delete=models.CASCADE, related_name='category_need', null=True)

class Product(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=400, blank=False)
    category = models.ForeignKey(ProductCategory, on_delete = models.CASCADE, blank=True, related_name='products')
    status = models.IntegerField(choices=STATUS, default=0)

    def get_absolute_url(self):
        return reverse("product", kwargs={'slug': self.slug})

views.py

class Search(ListView):
    template_name = 'search.html'
    model = Product
    queryset = Product.objects.filter(status=1)
    
    def get_context_data(self, **kwargs):
            context = super(Search, self).get_context_data(**kwargs)

        filter_need = Area.objects.filter(Exists(Need.objects.filter(need_area=OuterRef('pk'))))
        areas = Area.objects.prefetch_related(Prefetch('need_area', queryset=filter_need, to_attr='need_area__category_need__product')).filter(need_area__category_need__product__status=1).distinct()

            context['areas'] = areas
            return context

search.html

{% if areas %}
{% for area in areas %}
    <div class="border mb-4 pb-4 px-2">
    <h2 class="fw-bold my-2">{{area.title}}</h2>

        {% for need in area.need_area.all %}
            <h4 class="text-muted mt-4">{{need.title}}:</h4>

            {% for product_category in need.category_need.all %}

                {% for product in product_category.product.all %}
                    <a href="{{product.get_absolute_url}}" class="pe-2"><span class="rounded-pill bg-hubble text-dark f-12 p-2">{{product.title}}</span></a>
                {% endfor %}
            
            {% endfor %}

        {% endfor %}

    </div>
{% endfor %}
{% endif %}
Вернуться на верх