我有一个通用的ListView,我得到一些通用的东西(它与我的问题无关)。
我的模型Product
与Tag
具有ManyToMany关系,即Product
可以包含多个Tag
,而Tag
可以链接到多个Product
{1}}。
在这个通用ListView中,我想过滤所有实际为Tag
的{{1}},以便客户点击Product
,我可以稍后过滤。
到目前为止,我来到这里:
Tag
但是class IndexView(generic.ListView):
template_name = 'produits/index.html'
context_object_name = 'liste_produits'
def get_queryset(self):
"""Return the last five created products."""
return Produit.objects.order_by('-date_v_fin', '-date_v_debut')[:5]
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
context['produits_tags'] = list(
Tag.objects.values_list('nom', flat=True)
)
context['produits_tags'].insert(0, _("Tous"))
return context
会返回所有Tag.objects.values_list('nom', flat=True)
,包括那些没有Tag
的人。如何过滤?
答案 0 :(得分:0)
试试这个:
Tag.objects.filter(product_set__isnull=False).values_list('nom', flat=True)
答案 1 :(得分:0)
related_name
像这样使ManyToMany关系更具可读性:
class Produit(BaseModel):
tags = models.ManyToManyField(Tag, related_name='produits')
然后,这是我如何获得Tag
使用的所有Produit
。我想它不是很优化,但它的作用就像一个魅力:
class IndexView(generic.ListView):
#blabbla ignoring code in-between
def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)
context['produits_tags'] = list(
Tag.objects.filter(produits__in=Produit.objects.all()).distinct()
)
context['produits_tags'].insert(0, _("All"))
return context