我正在使用django-filters构建过滤系统,使用自定义过滤方法时出现问题。我有两个模型Plat
和UserAdvanced
都具有对应于GeoDjango中的Point的location
属性(如果您不熟悉GeoDjango,则不重要,该错误与GeoDjango不相关)。
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
是GeoDjango的内置函数,可以应用于点。
问题是,当我在过滤方法中执行完全相同的操作时,出现错误。这是代码:
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')
您在distance_method上有错字
return queryset.filter(location__distance_lte(location2, D(m = value)))
必须是:
return queryset.filter(location__distance_lte=(location2, D(m = value)))
^^^