Используйте django-фильтры на нескольких моделях - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь создать возможность поиска в моем проекте Django, которая будет фильтровать несколько моделей (в настоящее время 3) и возвращать значение из модели опросов. Он работает для одной модели и дополнительной модели, связанной внешним ключом. Но когда я добавил раскрывающееся меню для третьей модели, не содержащей прямой ссылки на исходную модель, я получил сообщение о том, что их ключевое слово было недоступно (поскольку оно не было найдено в модели):

Невозможно разрешить ключевое слово "комнаты" в поле. Выборы: DateBegin, FAN, IS, Местоположение, PI, владения, 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-фильтрами, который будет искать несколько моделей? Могу ли я создать объединенный набор запросов или что-то подобное? Я попытался добавить список к фильтрам Meta (например, model = [surveys, rooms, holdings]), но это, очевидно, не работает.

Если django-фильтры не могут этого сделать, есть ли другие варианты для поиска нескольких моделей в Django?

...