我希望找到范围在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。
答案 0 :(得分:1)
这里有两件事不对。
首先,你误解了select_related()
的作用。它不会将相关模型中的字段转换为当前模型。相反,它只是预先获取相关实例,因此执行model_instance.foreignkey_field.field_on_related_model
不会导致另一个数据库命中。
其次,你的模型与你最初关于外键的说法相矛盾。你说它是从GeoLocation到Records,但模型定义表明这是另一回事。 select_related
不能朝这个方向发展 - 鉴于您当前的模型,无法一次查询GeoLocation并获取相关记录。但是,您可以查询记录并获取相关的地理位置。
(第三,您对我使用单元素in
查询的评论的回答完全不相关。使用tags_slug=tag
。)