Как настроить фильтрацию с помощью Filter.method django -filter - PullRequest
0 голосов
/ 26 января 2020

Я создаю веб-сайт с Django и использую приложение django -filter для создания системы фильтрации для продуктов моего сайта. По сути, все пользователи моего сайта имеют атрибут localisation, который представляет их текущее местоположение (этот атрибут - PointField из Geo Django). Я хотел бы, чтобы пользователь мог фильтровать товары, продаваемые пользователями, расположенными рядом с его местоположением. Для этого я использую аргумент method django_filters для настройки фильтрации. Я думаю, что я хочу сделать довольно просто, но у меня проблемы с его реализацией из-за отсутствия явных примеров в документации django -фильтра. Ниже вы можете найти то, что я пробовал до сих пор, с использованными моделями, чтобы вы могли понять, что я сделал.

Структура отношений между моделями немного сложна, но я не думаю, что она вам нужна, чтобы понять мой вопрос. Вот полное объяснение структуры в случае ее полезности: модель User связана с моделью UserAdvanced, предоставляющей расширенные возможности для пользователя. Эта модель UserAdvanced опционально связана с моделью Chef, которая представляет пользователей, которые могут продавать товары. Наконец, модель Chef может быть связана с моделью Plat, которая представляет продукты, продаваемые пользователем. Я хочу отфильтровать продукт Plat на основе атрибута localisation модели UserAdvanced.

models.py (только соответствующие части)

class UserAdvanced(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    localisation = models.PointField(blank = True, null = True)

class Chef(models.Model):
    userAdv = models.OneToOneField(UserAdvanced, on_delete = models.CASCADE)

class Plat(models.Model):
    chef = models.ForeignKey(Chef, on_delete = models.CASCADE)

filters.py

class PlatFilter(django_filters.FilterSet):
    titre = django_filters.CharFilter(
        field_name='titre', label='Mot clé :', lookup_expr='icontains',
        widget=forms.TextInput(attrs={'class': 'form-control'}),
    )

    distance = django_filters.NumberFilter(
        method='distance_filter', label='Distance maximum en mètres de votre position (n\'oubliez pas de la mettre à jour si nécessaire)',
        widget=forms.NumberInput(attrs={'class': 'form-control'}),
    )

    class Meta:
        model = Plat
        fields = ['titre', 'nb_portions', 'date_prep']

    def distance_filter(self, queryset, name, value):
        return queryset.filter(chef__useradvanced__localisation.distance(request__user__useradvanced__localisation)__lte = value)

Я вычисляю расстояние между двумя точками, используя функцию расстояния Geo Django, и я пытаюсь отфильтровать набор запросов, чтобы получить продукты, для которых это расстояние меньше или равно значение предоставляется. В настоящее время у меня есть SyntaxError: invalid syntax. Как я уже сказал, я думаю, что решение довольно простое, но мне трудно найти его из-за отсутствия документации по inte rnet. Небольшая помощь будет принята с благодарностью.

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

1 Ответ

1 голос
/ 12 февраля 2020

Ваша проблема здесь на последней строке

def distance_filter(self, queryset, name, value):
    return queryset.filter(chef__useradvanced__localisation.distance(request__user__useradvanced__localisation)__lte = value)
    #                                                                                                          ^here

__lte на неправильной

...