I have two models Shop
and Address
.
Shop Model
:
class Shop(BaseModel):
name = models.CharField(
max_length=100,
blank=True,
null=True
)
address = models.ForeignKey(
Address,
blank=True,
null=True,
on_delete=models.SET_NULL
)
objects = LocationManager()
Address Model
:
class Address(BaseModel):
latitude = models.DecimalField(
max_digits=16,
decimal_places=14,
blank=True,
null=True
)
longitude = models.DecimalField(
max_digits=16,
decimal_places=14,
blank=True,
null=True
)
status = models.NullBooleanField(null=True)
I have created a custom Manager for Shop model
class LocationManager(models.Manager):
def nearby(self, latitude, longitude, proximity):
"""
Return all object which distance to specified coordinates
is less than proximity given in kilometers
"""
# Great circle distance formula
# acos will not work in sqlite
gcd = """
6371 * acos(
cos(radians(%s)) * cos(radians(latitude))
* cos(radians(longitude) - radians(%s)) +
sin(radians(%s)) * sin(radians(latitude))
)
"""
queryset = self.get_queryset().select_related(
'address'
).exclude(
latitude=None
)
.exclude(
longitude=None
)
.annotate(
distance=RawSQL(
gcd,
(
latitude,
longitude,
latitude
)
)
).filter(
distance__lt=proximity
).order_by('distance')
return queryset
Now I want to find nearby shops using custom manager:
Shop.objects.nearby(13.244334,72.329832,20)
But i am getting this error:
Cannot resolve keyword 'latitude' into field. Choices are: address, address_id, name
How can I use filter my queryset by latitude
to find nearby shop?