Я использую Django -фильтр для создания системы фильтрации для своего веб-сайта, и мне трудно адаптировать традиционные запросы в пользовательском методе фильтрации Django -фильтра. Я использую Geo Django для извлечения всех объектов, находящихся на определенном расстоянии от указанного c местоположения.
Вот мои модели:
class UserAdvanced(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE)
location = models.PointField(blank = True, null = True)
class Plat(models.Model):
location = models.PointField(blank = True, null = True)
Как видите, У объектов UserAdvanced
и Plat
есть атрибут location, и я хочу получить объекты Plat
, расположенные рядом (скажем, в пределах 1000 м) с UserAdvanced
, выполняющим запрос. Это легко сделать с помощью:
location_user = request.user.useradvanced.location
Plat.objects.filter(location__distance_lte=(location_user, D(m=1000)))
Проблема в том, что я хочу сделать то же самое в классе Filter из Django -фильтров, чтобы пользователь мог выбрать значение расстояния. Вот что я попробовал:
from django.contrib.gis.geos import *
from django.contrib.gis.measure import D
import django_filters
class PlatFilter(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(PlatFilter, self).__init__(*args, **kwargs)
distance = django_filters.NumberFilter(
field_name='location', method='distance_filter', label='...',
widget=forms.NumberInput(attrs={'class': 'form-control'}),
)
class Meta:
model = Plat
def distance_filter(self, queryset, name, value):
location_user = self.user.useradvanced.location
return queryset.filter(location__distance_lte(location_user, D(m = value)))
Это тот же код, что и раньше, но, к сожалению, я получаю эту ошибку: NameError at /
name 'location__distance_lte' is not defined
Я не понимаю, почему я получаю эту ошибку, может кто-то Помоги мне ? Я также пытался использовать name__distance_lte
, но я получил ту же ошибку.
Заранее спасибо!