Django w/django_filters выполняет поиск по методам или немодельным полям

Версии: 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 }} выполнял свою работу. Тем не менее, класс фильтра кажется немного более абстрактным, и документация просто заставляет меня чесать голову большую часть времени.

Я мог бы реплицировать поля категории и поставщика в объект рейтинга, но это похоже на хакерство. Я потратил несколько часов, пытаясь найти кого-то еще, делающего что-то подобное, но у меня такое чувство, что я ищу неправильную терминологию или просто упускаю что-то ослепляюще очевидное.


person jayv    schedule 26.08.2020    source источник


Ответы (1)


Из документации:

field_name: имя поля модели для фильтрации. Вы можете перемещаться по «путям отношений», используя синтаксис Django __ для фильтрации полей в связанной модели. бывший, manufacturer__name.

Итак, похоже, вы можете сделать следующее:

rating_filter = django_filters.RangeFilter(
    field_name='product__category', lookup_expr='range')
person Selcuk    schedule 26.08.2020
comment
Отлично, спасибо! Это поставило меня на правильный путь, хотя мне пришлось добавить имя поля, которое я искал, чтобы получить эффект, к которому я стремился: vendor_filter = django_filters.CharFilter(field_name='product__category__name', label='vendor') время ответить на мой вопрос. - person jayv; 26.08.2020
comment
Правда, RangeFilter не имеет особого смысла для этого поля, но я рад, что это помогло. - person Selcuk; 27.08.2020