如何根据外键过滤对象

时间:2018-03-03 15:59:14

标签: django filter foreign-keys annotate

我有2个名为product和product_category的模型类

class product_category(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    category_name = models.CharField(max_length=20, blank=False, null=False, default="")
    slug = models.SlugField(max_length=255, unique=True)


class product(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    product_name = models.CharField(max_length=50, blank=False, null=False, default="")
    product_description = models.TextField(max_length=280, blank=True, null=True, default="")
    product_type = models.ForeignKey(product_category, related_name='type_category', blank=True, null=True, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=255, unique=True)


在views.py中,我通常会加载与单个用户相关的所有产品

all_category = product.objects.filter(user=user)

但我正在努力过滤的是基于它们所在类别的产品清单。

如您所见,product_type是可选的,因此某些产品可能没有任何类型。这些产品应列在清单的末尾。

这就是我想在网站上显示的方式

  • 1类
    • 产物-1
    • 产物-2
    • product-3
  • 类-2-
    • 产物-4
    • 产物-5
    • 产物-6
  • 类别-3-
    • 产物-7
  • 产物-8
  • 产物-9
  • 产物-10

我怎样才能做到这一点?

编辑1。

感谢neeraj-kumar,我找到了我想要的东西。

这里的答案是代码中的一点点,以便更清楚地看到结果。

views.py

    all_category = product_category.objects.filter(user=user)
    product_exclude = product.objects.exclude(id__in=all_category.values_list('type_category__id',flat=True)).filter(user=user)

template.html

{% for cat in all_category %}
    {% with products=cat.type_category.all %}
        <h5>{{cat.category_name}}</h5>
        {% if products|length %}
            {% for pro in products %}
                <p>{{ pro }}</p>
            {% endfor %}
        {% endif %}
        <br>
    {% endwith %}
{% endfor %}
{% for pro in product_exclude %}
    <p>{{ pro }}</p>
{% endfor %}

1 个答案:

答案 0 :(得分:0)

all_category = product_category.objects.filter(user=user)
product_exclude = product.objects.exclude(id__in=all_category.values_list('type_category__id',flat=True)

传递模板中的var

{% for cat in all_category %}
   {% with products = cat.type_category.all %}
       {% if products|length %}
            {% for pro in products %}
                {{ pro }}
            {% endfor %}
       {% endif %}
   {% endwith %}
{% endfor %}
{% for pro in product_exclude %}
     {{ pro }}
{% endfor %}