如何使用Filter自定义过滤。django过滤器的方法

如何使用Filter自定义过滤。django过滤器的方法,django,django-filter,Django,Django Filter,我正在用Django建立一个网站,我正在使用应用程序Django filter为我网站的产品建立一个过滤系统。基本上,我的网站的所有用户都有一个表示他们当前位置的本地化属性。该属性是GeoDjango的一个点域。我希望用户能够过滤位于其位置附近的用户销售的产品。为此,我使用django_过滤器的method参数来定制过滤。我认为我想要做的很简单,但由于django filter文档中缺乏明确的示例,我在实现它时遇到了麻烦。你可以在下面找到我到目前为止所做的尝试,以及所使用的模型,这样你就可以理解

我正在用Django建立一个网站,我正在使用应用程序Django filter为我网站的产品建立一个过滤系统。基本上,我的网站的所有用户都有一个表示他们当前位置的本地化属性。该属性是GeoDjango的一个点域。我希望用户能够过滤位于其位置附近的用户销售的产品。为此,我使用django_过滤器的method参数来定制过滤。我认为我想要做的很简单,但由于django filter文档中缺乏明确的示例,我在实现它时遇到了麻烦。你可以在下面找到我到目前为止所做的尝试,以及所使用的模型,这样你就可以理解我所做的

模型之间的关系结构有点复杂,但我认为你不需要它来理解我的问题。以下是该结构的完整解释,以防它有用:用户模型链接到一个UserAdvanced模型,该模型为用户提供高级功能。此UserAdvanced模型可选地链接到代表可以销售产品的用户的Chef模型。最后,厨师模型可以链接到表示用户销售的产品的平台模型。我想根据UserAdvanced模型的本地化属性过滤Plat产品

仅适用于型号.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)
过滤器.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)
我正在使用GeoDjango的距离函数计算两点之间的距离,并尝试过滤queryset,以获得该距离小于或等于所提供值的乘积。目前,我有一个语法错误:无效语法。正如我所说,我认为解决方案相当简单,但由于缺乏互联网上的文档,我很难找到它。如果你能帮我一点忙,我将不胜感激


提前谢谢

您的问题在最后一行

def distance_filter(self, queryset, name, value):
    return queryset.filter(chef__useradvanced__localisation.distance(request__user__useradvanced__localisation)__lte = value)
    #                                                                                                          ^here
__目前的lte是错误的