在Django中过滤多对多的关系

时间:2012-12-13 07:29:47

标签: python django

我有两个班级位置和供应商。供应商向一个或多个城市供应产品。

class Location(models.Model):
    cities = models.CharField(max_length=30)

class Supplier(models.Model):
    name = models.CharField(max_length=100)
    supplied_cities = models.ManyToManyField(Location)

现在,我必须从城市列表中获取城市的所有供应商。 例如:如果点击伦敦,我应该得到所有与伦敦相关的供应商。我该怎么做?

Supplier.objects.filter(supplied_cities= 1)

上面的shell命令列出了来自city 1(int)的所有供应商。但是我必须从网页上捕获城市名称并根据它进行过滤?

查看:

def my_view(request):
    cityName = request.GET['place']
    sellers = Supplier.objects.filter(supplied_cities= Location.objects.get(cities=cityName))
    context = {'sellers' : sellers }
    return render_to_response('results.html',context,context_instance=RequestContext(request))

模板:

{% for sellers in object_list %}
<li>  {{ sellers.name }} </li>
{% endfor %}

1 个答案:

答案 0 :(得分:2)

您想使用lookups that span relationships

def my_view(request):
    city_name = request.GET.get('place')
    sellers = Supplier.objects.filter(supplied_cities__cities=city_name)
    context = {'sellers' : sellers }
    return render_to_response('results.html', context, context_instance=RequestContext(request))

然后是你的模板:

{% for seller in sellers %}
    <li>  {{ seller.name }} </li>
{% endfor %}

你错误地命名了你的上下文变量。

我强烈建议您使用django formsurl dispatcher将参数传递给您的观点。

url(r'^/sellers/(?P<city>\w+)/$', my_view, name='sellers')

def my_view(request, city):
    # rest of your view