Добрый день, у меня вопрос по поводу django-фильтров. Моя проблема:
В моем файле models.py определены два класса:
class Volcano(models.Model):
vd_id = models.AutoField("ID, Volcano Identifier (Index)",
primary_key=True)
[...]
class VolcanoInformation(models.Model):
# Primary key
vd_inf_id = models.AutoField("ID, volcano information identifier (index)",
primary_key=True)
# Other attributes
vd_inf_numcal = models.IntegerField("Number of calderas")
[...]
# Foreign key(s)
vd_id = models.ForeignKey(Volcano, null=True, related_name='vd_inf_vd_id',
on_delete=models.CASCADE)
Два из них связаны через атрибут vd_id.
Я хочу разработать инструмент поиска, который позволит пользователю искать вулкан по количеству кальдер (vd_inf_numcal).
Я использую django-фильтры, а пока вот мои filters.py:
from .models import *
import django_filters
class VolcanoFilter(django_filters.FilterSet):
vd_name = django_filters.ModelChoiceFilter(
queryset=Volcano.objects.values_list('vd_name', flat=True),
widget=forms.Select, label='Volcano name',
to_field_name='vd_name',
)
vd_inf_numcal = django_filters.ModelChoiceFilter(
queryset=VolcanoInformation.objects.values_list('vd_inf_numcal', flat=True),
widget=forms.Select, label='Number of calderas',
)
class Meta:
model = Volcano
fields = ['vd_name', 'vd_inf_numcal']
Мои views.py:
def search(request):
feature_list = Volcano.objects.all()
feature_filter = VolcanoFilter(request.GET, queryset = feature_list)
return render(request, 'app/search_list.html', {'filter' : feature_filter, 'feature_type': feature_type})
В моем приложении появляется раскрывающийся список возможного количества кальдер, но поиск не дает результата, который является нормальным, поскольку нет никакой связи между VolcanoInformation.vd_inf_numcal, VolcanoInformation.vd_id и Volcano.vd_id.
В нем даже говорится «Выберите правильный выбор. Этот выбор не является одним из доступных вариантов».
Мой вопрос: как я могу создать эту ссылку, используя django_filters?
Думаю, мне следует написать какой-нибудь метод в классе, но я абсолютно не знаю, как это сделать.
Если бы у кого-нибудь был ответ, я был бы более чем благодарен!