Я строю систему фильтрации с django -фильтрами, и у меня возникла проблема при использовании пользовательского метода фильтрации. У меня есть две модели Plat
и UserAdvanced
, каждая из которых имеет атрибут location
, соответствующий точке из Geo Django (не имеет значения, если вы не знакомы с Geo Django, ошибка не Geo Django related).
models.py
class UserAdvanced(models.Model):
location = models.PointField(blank = True, null = True)
class Plat(models.Model):
location = models.PointField(blank = True, null = True)
Я хочу отфильтровать все Plat
объекты, которые расположены на расстоянии, меньшем или равном значению из местоположения UserAdvanced
объект. Когда я делаю это в оболочке, она отлично работает:
location2 = useradvanced_object.location
Plat.objects.filter(location__distance_lte=(location2, D(m=1000)))
Примечание: distance
- это встроенная функция Geo Django, которую можно применить к точке.
Проблема в том, что, когда я делаю то же самое внутри метода фильтрации, я получаю ошибку. Вот код:
filters.py
from actualites.models import Plat
from django.contrib.gis.geos import Point
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_filter = django_filters.NumberFilter(
field_name='location', method='distance_method'
)
class Meta:
model = Plat
def distance_method(self, queryset, name, value):
location2 = self.user.useradvanced.localisation
return queryset.filter(location__distance_lte(location2, D(m = value)))
Я получаю эту ошибку:
NameError at /
name 'location__distance_lte' is not defined
Я пытался использовать имя вместо местоположения, используя вместо _ __, ничего не работает. Я не могу понять почему, так как он отлично работает в оболочке. Я проверил, что все хорошо установлено и импортировано в виртуальную среду. Небольшая помощь будет принята с благодарностью.
Заранее спасибо!
Примечание: вот местные переменные, если они могут помочь:
location2 <Point object at 0x7f06d91254d8>
name 'location'
queryset <QuerySet [<Plat: PLAT TEST>, <Plat: Pâtes aux poivrons>, <Plat: Boeuf bourguingnon>, <Plat: Burrito mexicain>]>
self <actualites.filters.PlatFilter object at 0x7f06d804e5f8>
value Decimal('1000000000000')