使用基于函数的视图过滤 Geodjango 结果
Filtering Geodjango Results using Function Based Views
目前,网页显示搜索结果列表,按距离排序(类似于ListView)。我想做的是创建一个过滤器来进一步缩小这些结果的范围。
Views.py
def teacher_list(request, **kwargs):
if request.method == 'GET':
form = LocationForm(request.GET)
if form.is_valid():
SearchPoint = Point(form.cleaned_data['Lng'], form.cleaned_data['Lat'])
Radius = form.cleaned_data['SearchRadius']
Type = form.cleaned_data['Type']
else:
form = LocationForm()
SearchPoint = Point(0, 0)
Radius = form.cleaned_data['SearchRadius']
else:
form = LocationForm()
SearchPoint = Point(0, 0)
Radius = form.cleaned_data['SearchRadius']
results = Teacher.objects.filter(location__distance_lte=
(SearchPoint, D(km=Radius)))\
.annotate(distance=Distance('location', SearchPoint))\
.order_by('distance')
return render(request, "users/teacher_list.html", context={"form": form,"teacher_list":results,})
目前过滤有效,但不适用于分类变量。例如,如果我更改位置或搜索半径,表格会更新并且我会看到新结果。
但是,我有一个名为 TYPE
的分类变量,它可以是免费的也可以是付费的。如果一个人选择免费过滤器,则只显示免费的结果,反之亦然。这些是我模型中的布尔字段。
class Teacher(models.Model):
free = models.BooleanField()
paid = models.BooleanField()
我尝试添加的是某种过滤器参数,其工作方式类似于
if Type == 'Free':
filter_variable = 'free=True'
elif Type == 'Paid':
filter_variable = 'paid=True'
else:
filter_variable =''
new_result_set = results.filter(filter_variable)
这是一种有效的过滤方式吗?我查看了 django-filter,但看起来与 geodjango 不兼容,似乎对我需要的东西来说太过分了。
是吗?
filter_variable = {Type.lower(): True} if Type else {}
new_result_set = results.filter(**filter_variable)
目前,网页显示搜索结果列表,按距离排序(类似于ListView)。我想做的是创建一个过滤器来进一步缩小这些结果的范围。
Views.py
def teacher_list(request, **kwargs):
if request.method == 'GET':
form = LocationForm(request.GET)
if form.is_valid():
SearchPoint = Point(form.cleaned_data['Lng'], form.cleaned_data['Lat'])
Radius = form.cleaned_data['SearchRadius']
Type = form.cleaned_data['Type']
else:
form = LocationForm()
SearchPoint = Point(0, 0)
Radius = form.cleaned_data['SearchRadius']
else:
form = LocationForm()
SearchPoint = Point(0, 0)
Radius = form.cleaned_data['SearchRadius']
results = Teacher.objects.filter(location__distance_lte=
(SearchPoint, D(km=Radius)))\
.annotate(distance=Distance('location', SearchPoint))\
.order_by('distance')
return render(request, "users/teacher_list.html", context={"form": form,"teacher_list":results,})
目前过滤有效,但不适用于分类变量。例如,如果我更改位置或搜索半径,表格会更新并且我会看到新结果。
但是,我有一个名为 TYPE
的分类变量,它可以是免费的也可以是付费的。如果一个人选择免费过滤器,则只显示免费的结果,反之亦然。这些是我模型中的布尔字段。
class Teacher(models.Model):
free = models.BooleanField()
paid = models.BooleanField()
我尝试添加的是某种过滤器参数,其工作方式类似于
if Type == 'Free':
filter_variable = 'free=True'
elif Type == 'Paid':
filter_variable = 'paid=True'
else:
filter_variable =''
new_result_set = results.filter(filter_variable)
这是一种有效的过滤方式吗?我查看了 django-filter,但看起来与 geodjango 不兼容,似乎对我需要的东西来说太过分了。
是吗?
filter_variable = {Type.lower(): True} if Type else {}
new_result_set = results.filter(**filter_variable)