【发布时间】:2018-03-04 03:31:11
【问题描述】:
我有 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
- product-1
- product-2
- product-3
- 类别 2
- product-4
- product-5
- 产品6
- 类别 3
- product-7
- product-8
- product-9
- product-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)
模板.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 %}
【问题讨论】:
标签: django filter foreign-keys annotate