django - 多个查询到一个

时间:2011-09-28 13:37:32

标签: django django-models django-queryset geodjango

我希望找到范围在100英里范围内的Records tag。我有两个独立工作的查询(见下文),但我不知道如何将它们放在一起。

此外,Records模型的外键指向名为GeoLocation的{​​{1}}模型。我希望能够一次性显示来自geo_location(Records两个模型的字段。我在下面的GeoLocation查询中尝试使用.select_related(),但出于某种原因,我只能按照我的预期显示GeoLocation模型字段而不是其他GeoLocation模型字段。

Records

有什么想法吗?


这些是我的模特:

tag_search = Records.objects.filter(tags__slug__in=[tag])
geo_search = GeoLocation.objects.select_related().filter(srid2163__distance_lte=(pnt, D(mi=100))).distance(pnt)

对于from taggit.managers import TaggableManager from django.contrib.gis.db import models class GeoLocation (models.Model): lat = models.FloatField(blank=True) long = models.FloatField(blank=True) srid2163 = models.PointField(blank=True,srid=2163) server_time = models.DateTimeField(auto_now_add=True) objects = models.GeoManager() def __unicode__(self): return u'%s %s %s' % (self.lat, self.long, self.server_time) class Records(models.Model): title = models.CharField(blank=True, max_length=50) message_body = models.TextField() server_time = models.DateTimeField(auto_now_add=True) geo_location = models.ForeignKey(GeoLocation, related_name='geoloc') tags = TaggableManager() def __unicode__(self): return u'%s %s %s' % (self.title, self.message_body, self.server_time) 模型中的tags字段,我正在使用django-taggit

1 个答案:

答案 0 :(得分:1)

这里有两件事不对。

首先,你误解了select_related()的作用。它不会将相关模型中的字段转换为当前模型。相反,它只是预先获取相关实例,因此执行model_instance.foreignkey_field.field_on_related_model不会导致另一个数据库命中。

其次,你的模型与你最初关于外键的说法相矛盾。你说它是从GeoLocation到Records,但模型定义表明这是另一回事。 select_related不能朝这个方向发展 - 鉴于您当前的模型,无法一次查询GeoLocation并获取相关记录。但是,您可以查询记录并获取相关的地理位置。

(第三,您对我使用单元素in查询的评论的回答完全不相关。使用tags_slug=tag。)