Версии: Django 3.0.6, Python 3.8, MySQL 8.0, django_filters 2.3.0
Пожалуйста, потерпите меня, поскольку я не уверен, правильно ли я назвал вопрос. Я начну с соответствующего кода:
models.py
class Vendor(models.Model):
name = models.CharField(max_length=50)
class Category(models.Model):
name = models.CharField(max_length=50)
class Product(models.Model):
name = models.CharField(max_length=50)
vendor = models.ForeignKey('Vendor', on_delete=models.SET_NULL, null=True)
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True)
class Rating (models.Model):
score = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(10)])
product = models.ForeignKey('Vendor', on_delete=models.SET_NULL, null=True)
def category(self):
return self.product.category
def vendor(self):
return self.product.vendor
filters.py
from .models import Vendor, Category, Product, Rating
import django_filters
class RatingFilter(django_filters.FilterSet):
rating_filter = django_filters.RAngeFilter(field_name='score', lookup_expr='range')
class Meta:
model = Rating
fields = '__all__'
views.py
from .filters import RatingFilter
def RatingSearch(request):
rating_list=Rating.objects.all()
rating_filter = RatingFilter(request.GET, queryset=rating_list)
return render (request, 'inventory/rating_search.html', { 'filter': rating_filter})
С базовой точки зрения SQL я знаю, что могу использовать модели в качестве схемы и фильтровать поиск записей рейтинга по категории или поставщику, устанавливая отношения между таблицами. Моя цель — использовать django_filters, чтобы делать то же самое в веб-форме.
Из коробки очень легко фильтровать рейтинги по продуктам и/или баллам. В чем я не могу разобраться, так это в том, как я могу фильтровать часть информации, на которую напрямую не ссылается модель. Когда я делаю подробный обзор рейтинга, мне не нужно делать ничего особенного, чтобы метод категории {{ rating.category }}
выполнял свою работу. Тем не менее, класс фильтра кажется немного более абстрактным, и документация просто заставляет меня чесать голову большую часть времени.
Я мог бы реплицировать поля категории и поставщика в объект рейтинга, но это похоже на хакерство. Я потратил несколько часов, пытаясь найти кого-то еще, делающего что-то подобное, но у меня такое чувство, что я ищу неправильную терминологию или просто упускаю что-то ослепляюще очевидное.