我有两个模型Shop
和Address
。
购物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()
地址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)
我为Shop模型创建了一个自定义管理器
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
现在我想使用自定义管理器找到附近的商店:
Shop.objects.nearby(13.244334,72.329832,20)
但是我收到了这个错误:
Cannot resolve keyword 'latitude' into field. Choices are: address, address_id, name
如何使用latitude
过滤我的查询集来查找附近的商店?
答案 0 :(得分:3)
您正在查询Shop
模型,而不是Address
模型。
您的Shop
模型没有任何名为latitude
的字段,如您的错误所述。
您应该使用字段查找按照链接对象Shop
(documentation)的属性过滤Address
由于Shop
模型已按字段Address
链接到您的address
模型,要按Shop
属性过滤Address
,您可以执行此操作(即latitude
字段):
Shop.objects.filter(address__latitude=<your_lookup_here>)
此外,您的两个exclude
方法可以像这样重写(使用Q
对象):
Shop.objects.exclude(
Q(address__latitude__isnull=True)
| Q(address__longitude__isnull=True)
)
我建议您阅读上面链接的有关queryset API的文档。