Django-filter:有效的查询在过滤方法内部无效

问题描述 投票:0回答:1

我正在使用django-filters构建过滤系统,使用自定义过滤方法时出现问题。我有两个模型PlatUserAdvanced都具有对应于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')
django django-queryset django-filter
1个回答
0
投票

您在distance_method上有错字

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

必须是:

return queryset.filter(location__distance_lte=(location2, D(m = value)))
                                            ^^^
© www.soinside.com 2019 - 2024. All rights reserved.