在多个模型上使用 django-filters
Use django-filters on multiple models
我正在尝试在我的 Django 项目中创建一个搜索功能,该功能将过滤多个模型(当前为 3 个)和 return 来自调查模型的值。它适用于单个模型和由外键绑定的附加模型。但是,当我为不包含对初始模型的直接引用的第三个模型添加下拉菜单时,我收到一条错误消息,指出它们的关键字不可用(因为它没有在模型中查找):
Cannot resolve keyword 'rooms' into field. Choices are: DateBegin, FAN, IS, Location, PI, holdings, id
型号:
#models.py
class rooms(models.Model):
ContainerLocation = models.CharField(max_length=100, blank=True, null=True)
Database = models.CharField(max_length=100, blank=True, null=True)
Name = models.CharField(max_length=100, blank=True, null=True)
Datatype = models.CharField(max_length=100, blank=True, null=True)
class holdings(models.Model):
Contents = models.CharField(max_length=700, blank=True, null=True, default='No description')
FAN = models.ForeignKey('surveys', on_delete=models.SET_NULL, blank=True, null=True)
Database = models.ForeignKey('rooms', on_delete=models.SET_NULL, blank=True, null=True)
...(more fields)...
class surveys(models.Model):
FAN = models.SlugField(max_length=100, blank=True, null=True)
PI = models.CharField(max_length=100, blank=True, null=True)
IS = models.CharField(max_length=100, blank=True, null=True)
DateBegin = models.DateField(blank=True, null=True)
Location = models.CharField(max_length=200, blank=True, null=True)
过滤器:
#filters.py
from django import forms
from datalibrary.models import surveys, rooms, holdings
import django_filters
class MultiFilter(django_filters.FilterSet):
FAN = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
PI = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Location = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Contents = django_filters.CharFilter(field_name='holdings__Contents', lookup_expr='icontains', label='Contents', distinct=True)
Room = django_filters.ModelChoiceFilter(queryset=rooms.objects.all(), label='Room', distinct=True)
class Meta:
model = surveys
fields = ['FAN', 'PI', 'Location', 'Contents', 'Room']
观看次数:
#views.py
def search(request):
multifilter = MultiFilter(request.GET, queryset=surveys.objects.all())
return render(request, 'search_results.html', {'filter': multifilter})
是否可以使用 django-filters 构建一个搜索多个模型的过滤器?我可以创建一个合并的查询集或类似的东西吗?我尝试将列表添加到过滤器 Meta
(例如 model = [surveys, rooms, holdings]
),但这显然不起作用。
如果 django-filters 做不到,是否有其他选项可以在 Django 中搜索多个模型?
我想出了它应该如何工作。可以在 Meta
下的 fields
变量中使用 modelname__field
(即两个下划线)指定另一个模型。所以它看起来像这样:
#filters.py
from django import forms
from datalibrary.models import surveys, rooms, holdings
import django_filters
class MultiFilter(django_filters.FilterSet):
FAN = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
PI = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Location = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Contents = django_filters.CharFilter(field_name='holdings__Contents', lookup_expr='icontains', label='Contents', distinct=True)
Room = django_filters.ModelChoiceFilter(lookup_expr='icontains', label='Room', distinct=True)
class Meta:
model = surveys
fields = ['FAN', 'PI', 'Location', 'Contents', 'rooms__name']
rooms__name
这里指的是模型rooms
.
中的字段name
请注意,已将 Room
更改为 rooms_name
。
我正在尝试在我的 Django 项目中创建一个搜索功能,该功能将过滤多个模型(当前为 3 个)和 return 来自调查模型的值。它适用于单个模型和由外键绑定的附加模型。但是,当我为不包含对初始模型的直接引用的第三个模型添加下拉菜单时,我收到一条错误消息,指出它们的关键字不可用(因为它没有在模型中查找):
Cannot resolve keyword 'rooms' into field. Choices are: DateBegin, FAN, IS, Location, PI, holdings, id
型号:
#models.py
class rooms(models.Model):
ContainerLocation = models.CharField(max_length=100, blank=True, null=True)
Database = models.CharField(max_length=100, blank=True, null=True)
Name = models.CharField(max_length=100, blank=True, null=True)
Datatype = models.CharField(max_length=100, blank=True, null=True)
class holdings(models.Model):
Contents = models.CharField(max_length=700, blank=True, null=True, default='No description')
FAN = models.ForeignKey('surveys', on_delete=models.SET_NULL, blank=True, null=True)
Database = models.ForeignKey('rooms', on_delete=models.SET_NULL, blank=True, null=True)
...(more fields)...
class surveys(models.Model):
FAN = models.SlugField(max_length=100, blank=True, null=True)
PI = models.CharField(max_length=100, blank=True, null=True)
IS = models.CharField(max_length=100, blank=True, null=True)
DateBegin = models.DateField(blank=True, null=True)
Location = models.CharField(max_length=200, blank=True, null=True)
过滤器:
#filters.py
from django import forms
from datalibrary.models import surveys, rooms, holdings
import django_filters
class MultiFilter(django_filters.FilterSet):
FAN = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
PI = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Location = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Contents = django_filters.CharFilter(field_name='holdings__Contents', lookup_expr='icontains', label='Contents', distinct=True)
Room = django_filters.ModelChoiceFilter(queryset=rooms.objects.all(), label='Room', distinct=True)
class Meta:
model = surveys
fields = ['FAN', 'PI', 'Location', 'Contents', 'Room']
观看次数:
#views.py
def search(request):
multifilter = MultiFilter(request.GET, queryset=surveys.objects.all())
return render(request, 'search_results.html', {'filter': multifilter})
是否可以使用 django-filters 构建一个搜索多个模型的过滤器?我可以创建一个合并的查询集或类似的东西吗?我尝试将列表添加到过滤器 Meta
(例如 model = [surveys, rooms, holdings]
),但这显然不起作用。
如果 django-filters 做不到,是否有其他选项可以在 Django 中搜索多个模型?
我想出了它应该如何工作。可以在 Meta
下的 fields
变量中使用 modelname__field
(即两个下划线)指定另一个模型。所以它看起来像这样:
#filters.py
from django import forms
from datalibrary.models import surveys, rooms, holdings
import django_filters
class MultiFilter(django_filters.FilterSet):
FAN = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
PI = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Location = django_filters.CharFilter(lookup_expr='icontains', distinct=True)
Contents = django_filters.CharFilter(field_name='holdings__Contents', lookup_expr='icontains', label='Contents', distinct=True)
Room = django_filters.ModelChoiceFilter(lookup_expr='icontains', label='Room', distinct=True)
class Meta:
model = surveys
fields = ['FAN', 'PI', 'Location', 'Contents', 'rooms__name']
rooms__name
这里指的是模型rooms
.
name
请注意,已将 Room
更改为 rooms_name
。