我想在100英里半径内找到具有特定tag
的Records
。我有两个独立工作的查询(见下文),但我不知道如何把它们放在一起。
Records
模型也有一个指向GeoLocation
模型的外键geo_location
。我希望能够在一个镜头中显示两个模型(Records
和GeoLocation
的字段。我尝试在GeoLocation
查询上使用.select_related()
,但由于某种原因,我只让它显示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)
对于Records
模型中的tags
字段,我使用django-taggit。
这里有两点不对。
首先,你误解了select_related()
的作用。它不会将相关模型中的字段带入当前模型。相反,它只是预取相关的实例,因此执行model_instance.foreignkey_field.field_on_related_model
不会导致另一次db命中。
其次,你的模型与你最初所说的外键相矛盾。您说它是从GeoLocation到Records,但模型定义显示这是另一种方式。select_related
不工作在那个方向-没有办法,给定您当前的模型,查询地理位置,并得到相关的记录在一个去。但是,您可以查询记录并获得相关的地理位置。
(第三,你对我关于使用单元素in
查找的评论的回答完全无关紧要。使用tags_slug=tag
.)