Django - ForeignKey()使用与行ID不同的列?

时间:2009-05-08 18:32:31

标签: django django-models location django-urls

我有一个名为Location的应用程序。位置有国家,州,城市,Big_City_Nearby,经度,纬度。

我有一个待售物品的申请。项目有标题,链接,描述,价格&位置是ForeignKey()。

现在,如果有人想要查看在美国销售的所有商品,他们会点击一个链接(比如http://example.com/United-States/),该网址会在“美国”中作为国家/地区,城市和big_city_nearby空。

#in view.py
class by_location(request, country, state, city, big_city_nearby)
   location = Location.objects.filter(country=country, state=state, city=city, big_city_nearby=big_city_nearby)
   items = Items.objects.filter(location__in=[location.id for loc in location])
   return render_to_response('item/by_location.html', {"items":itmes, "country":countyr, "cit":city, "nearby":big_city_nearby})

如果他们传入(http://example.com/United_State/California/Oakland)没有问题,因为我可以继续列出奥克兰的所有项目,而无需显示每个项目的位置。

问题出在选择http://example.com/United_States/http://example.com/United_States/California/时。因为我现在必须显示每个项目的位置,因为这些项目可能来自不同的城市。

因此,当模板获取项目列表时,它只获取每个项目中的ForeignKey(位置)。我可以放置另一个循环,其中检查每个项目并获取Location对象并将其放入带有item对象的元组中。但那将是非常低效的SQL。因为我必须为找到的每个项目点击数据库以获取实际的位置对象。

有没有办法可以说ForeignKey将城市而不是Id保存到数据库中的位置行。

使问题变得简单:是否有更好的方法将该位置作为应用程序离开,而无需提供国家,州,城市等。在每个项目行中。

THX,

VN44CA

1 个答案:

答案 0 :(得分:2)

Item.objects.filter(...).select_related("location")。这将对位置表进行加入,因此它只是一个查询。

更好的是Item.objects.filter(location__country=country, location__state=state).select_related("location"),您可以完全省略Location查询。

老实说,我很难搞清楚这是否只是你需要的,但它可以处理O(N)查询问题。