Я создаю веб-сайт с 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. Небольшая помощь будет принята с благодарностью.
Заранее спасибо!