Django -filter: рабочий метод не работает внутри метода фильтрации - PullRequest
0 голосов
/ 30 января 2020

Я строю систему фильтрации с 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')

1 Ответ

1 голос
/ 30 января 2020

У вас есть опечатка на distance_method

return queryset.filter(location__distance_lte(location2, D(m = value)))

должно быть:

return queryset.filter(location__distance_lte=(location2, D(m = value)))
                                            ^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...