Django -filter: NameError в пользовательском методе фильтрации - PullRequest
0 голосов
/ 29 января 2020

Я использую 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, но я получил ту же ошибку.

Заранее спасибо!

...