在多个模型上使用 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