我正在尝试使用 Django extra() 方法过滤一定半径内的所有对象,就像在这个答案中一样:http ://stackoverflow.com/questions/19703975/django-sort-by-distance/26219292但是我在使用“gcd”表达式时遇到了一些问题,因为我必须通过两个外键关系而不是使用直接模型字段来达到纬度和经度。
特别是,我有一个体验课:
class Experience(models.Model):
starting_place_geolocation = models.ForeignKey(GooglePlaceMixin, on_delete=models.CASCADE,
related_name='experience_starting')
visiting_place_geolocation = models.ForeignKey(GooglePlaceMixin, on_delete=models.CASCADE,
related_name='experience_visiting')
具有同一个 GooglePlaceMixin 类的两个外键:
class GooglePlaceMixin(models.Model):
latitude = models.DecimalField(max_digits=20, decimal_places=15)
longitude = models.DecimalField(max_digits=20, decimal_places=15)
...
这是我通过起始位置过滤体验对象的代码:
def search_by_proximity(self, experiences, latitude, longitude, proximity):
gcd = """
6371 * acos(
cos(radians(%s)) * cos(radians(starting_place_geolocation__latitude))
* cos(radians(starting_place_geolocation__longitude) - radians(%s)) +
sin(radians(%s)) * sin(radians(starting_place_geolocation__latitude))
)
"""
gcd_lt = "{} < %s".format(gcd)
return experiences \
.extra(select={'distance': gcd},
select_params=[latitude, longitude, latitude],
where=[gcd_lt],
params=[latitude, longitude, latitude, proximity],
order_by=['distance'])
但是当我尝试调用外键对象“starting_place_geolocation__latitude”时,它返回此错误:
column "starting_place_geolocation__latitude" does not exist
我应该怎么做才能达到外键值?先感谢您