Django:如何使用ManyToMany关系过滤模型

时间:2015-07-30 12:49:21

标签: django django-models models

我有一个通用的ListView,我得到一些通用的东西(它与我的问题无关)。

我的模型ProductTag具有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的人。如何过滤?

2 个答案:

答案 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