【问题标题】:Django w/django_filters lookups by methods or non-model fieldsDjango w/django_filters 按方法或非模型字段查找
【发布时间】: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


    【解决方案1】:

    来自documentation

    field_name:要过滤的模型字段的名称。您可以使用 Django 的 __ 语法遍历“关系路径”来过滤相关模型上的字段。例如,manufacturer__name

    所以看起来你基本上可以做到以下几点:

    rating_filter = django_filters.RangeFilter(
        field_name='product__category', lookup_expr='range')
    

    【讨论】:

    • 太好了,谢谢!这让我走上了正确的轨道,尽管我必须添加我正在搜索的字段名称才能获得我想要的效果: vendor_filter = django_filters.CharFilter(field_name='product__category__name', label='vendor') 我很感谢你是时候回答我的问题了。
    • 没错,RangeFilter 对于该领域没有多大意义,但我很高兴它有所帮助。
    猜你喜欢
    • 2019-06-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多