Geo Django子类化查询集
我正在使用GeoDjango搜索一系列不同类型的位置。例如,房屋和公寓模型都是位置的子类 使用下面的子类Queryset,我可以执行类似Location.objects.all的操作,并让它返回给我[,],这是我的愿望 但是,我还想确定到每个位置的距离。通常,在没有子类Queryset的情况下,图表2中的代码会为我返回从给定点到每个位置的距离。。。。[距离M=866.092847284] 但是,如果我尝试使用子类查询集查找距离,则会出现如下错误: AttributeError:“House”对象没有属性“distance” 你知道我如何保持返回子类对象查询集的能力,并且在子类对象上有可用的距离属性吗?任何建议都将不胜感激 附件1:Geo Django子类化查询集,django,django-models,django-queryset,geo,subclassing,Django,Django Models,Django Queryset,Geo,Subclassing,我正在使用GeoDjango搜索一系列不同类型的位置。例如,房屋和公寓模型都是位置的子类 使用下面的子类Queryset,我可以执行类似Location.objects.all的操作,并让它返回给我[,],这是我的愿望 但是,我还想确定到每个位置的距离。通常,在没有子类Queryset的情况下,图表2中的代码会为我返回从给定点到每个位置的距离。。。。[距离M=866.092847284] 但是,如果我尝试使用子类查询集查找距离,则会出现如下错误: AttributeError:“House”对象
class SubclassingQuerySet(models.query.GeoQuerySet):
def __getitem__(self, k):
result = super(SubclassingQuerySet, self).__getitem__(k)
if isinstance(result, models.Model) :
return result.as_leaf_class()
else :
return result
def __iter__(self):
for item in super(SubclassingQuerySet, self).__iter__():
yield item.as_leaf_class()
class LocationManager(models.GeoManager):
def get_query_set(self):
return SubclassingQuerySet(self.model)
class Location(models.Model):
content_type = models.ForeignKey(ContentType,editable=False,null=True)
objects = LocationManager()
class House(Location):
address = models.CharField(max_length=255, blank=True, null=True)
objects = LocationManager()
class Appartment(Location):
address = models.CharField(max_length=255, blank=True, null=True)
unit = models.CharField(max_length=255, blank=True, null=True)
objects = LocationManager()
附件2:
from django.contrib.gis.measure import D
from django.contrib.gis.geos import fromstr
ref_pnt = fromstr('POINT(-87.627778 41.881944)')
location_objs = Location.objects.filter(
point__distance_lte=(ref_pnt, D(m=1000)
)).distance(ref_pnt).order_by('distance')
[ (l, l.distance) for l in location_objs.distance(ref_pnt) ] # <--- errors out here
我正忙着解决这个问题。这个怎么样:
class QuerySetManager(models.GeoManager):
'''
Generates a new QuerySet method and extends the original query object manager in the Model
'''
def get_query_set(self):
return super(QuerySetManager, self).get_query_set()
其余的都可以这样做。您必须在所有子类中重新分配管理器 来自Django文档: 在非抽象基类上定义的管理器不会被子类继承。如果要从非抽象基重用管理器,请在子类上显式重新声明它。这些类型的管理器可能相当特定于它们所定义的类,因此继承它们通常会导致意外的结果,特别是对于默认管理器而言。因此,它们不会传递给子类