簡體   English   中英

prefetch_related 對象中的 Django 過濾器

[英]Django filter in prefetch_related object

我有一堂課,我正在使用 prefetch_related。 我想應用一個過濾器,以便它只顯示包含產品的類別以及產品狀態是否等於 1。

下面是我正在使用的代碼,但它多次向我展示了整個區域,並呈現了Needs模型中的所有項目。

模型.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})

視圖.py

class Search(LoginRequiredMixin, ListView):
    template_name = 'search/product_search.html'
    model = Product
    queryset = Product.objects.filter(status=1)
    
    def get_context_data(self, **kwargs):
            context = super(ManualSearch, self).get_context_data(**kwargs)
            areas = Area.objects.prefetch_related('need_area__category_need__products').filter(need_area__category_need__products__gt=0)

            context['areas'] = areas
            return context

product_search.html

{% 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 my-2">{{need.title}}:</h4>
        {% for product_category in need.category_need.all %}
            {% for product in product_category.products.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 %}

您可以過濾反向關系並查看關系的任何實例是否存在/為空:

Area.objects.filter(need_area__category_need__products__isnull=False, need_area__category_need__products__status=1).distinct()

是一本關於關系(特別是 M2M)過濾的好讀物。 下次在問問題之前先嘗試谷歌搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM