【发布时间】:2020-08-26 00:16:46
【问题描述】:
版本: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 在 web 表单上做同样的事情。
开箱即用,按产品和/或分数过滤评级非常容易。我似乎无法理清的是如何通过未直接从模型中引用的信息进行过滤。当我对 Rating 进行详细视图时,我不需要做任何特别的事情来让类别方法 {{ rating.category }} 完成这项工作。但是,过滤器类似乎更抽象一些,而且文档大部分时间都让我摸不着头脑。
我可以将类别和供应商字段复制到评级对象,但这感觉就像黑客一样。我花了几个小时试图找到其他人做类似的事情,但我感觉我没有使用正确的术语进行搜索,或者我只是错过了一些非常明显的东西。
【问题讨论】:
标签: python python-3.x django django-filters