Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django过滤器外键相关模型过滤_Django_Search_Filter_Model_Django Filter - Fatal编程技术网

Django过滤器外键相关模型过滤

Django过滤器外键相关模型过滤,django,search,filter,model,django-filter,Django,Search,Filter,Model,Django Filter,我最近一直在努力使用dajngo过滤器。我有两个模型:书和作者 class Book(models.Model): title = models.CharField(max_length=150) author = models.ForeignKey(Author, on_delete=model.CASCADE) length = models.PositiveIntegerField() class Author(models.Model): first_name

我最近一直在努力使用dajngo过滤器。我有两个模型:书和作者

class Book(models.Model):
   title = models.CharField(max_length=150)
   author = models.ForeignKey(Author, on_delete=model.CASCADE)
   length = models.PositiveIntegerField()

class Author(models.Model):
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    year_of_birth = models.DateFiled()
所以,我想做一个过滤页面,在那个里你们可以通过它的属性(标题,作者等)和关于作者的信息找到这本书。例如,这本书短于300页,作者年龄在20-25岁之间

在filters.py中,我有:

import django_filters
from .models import Book, Author

class BookFilter(django_filters.FilterSet):
    class Meta():
        model = Book
        fields = ['title', 'author']

而且实际上也不知道如何通过不同的模型进行过滤,这与外键到书本模型有关

我对Dajngo几乎没有经验,我想知道这是否是一个非常复杂的问题
谢谢

每个过滤器基本上有两个重要参数:

field\u name
:要筛选的模型字段的名称。您可以使用Django的
\uu
语法遍历“关系路径”,以过滤相关模型上的字段。例如,
作者姓

lookup_expr:筛选时要使用的字段查找。Django的
\uu
语法可以再次用于支持查找转换。例如,
年份
。有关可使用的字段查找的完整列表,请参见此处:

字段
field\u name
lookup\u expr
一起表示一个完整的Django查找表达式。Django的查找参考中提供了查找表达式的详细说明:

考虑到这一点,以下是答案:

import django_filters
from .models import Book, Author

class BookFilter(django_filters.FilterSet):
    title = django_filters.CharFilter(field_name='title', lookup_expr='iexact')
    author = django_filters.CharFilter(field_name='author__last_name', lookup_expr='iexact')

    class Meta():
        model = Book
如果要按确切日期筛选,只需将以下内容添加到
BookFilter
类中:

date_of_birth = django_filters.DateFilter(field_name='author__date_of_birth', lookup_expr='exact')
birth_year__gt = django_filters.NumberFilter(field_name='author__date_of_birth', lookup_expr='year__gt')
birth_year__lt = django_filters.NumberFilter(field_name='author__date_of_birth', lookup_expr='year__lt')
不过,按出生年份筛选更有意义(例如,从1980年至1990年出生的作者那里获取所有书籍)。要做到这一点,您需要向
BookFilter
类添加以下内容:

date_of_birth = django_filters.DateFilter(field_name='author__date_of_birth', lookup_expr='exact')
birth_year__gt = django_filters.NumberFilter(field_name='author__date_of_birth', lookup_expr='year__gt')
birth_year__lt = django_filters.NumberFilter(field_name='author__date_of_birth', lookup_expr='year__lt')
您可以查看
django过滤器
软件包

Meta类中字段序列中的项可能包括“关系路径”,使用Django的_uu语法过滤相关模型上的字段

像这样:

import django_filters
from .models import Book, Author

class BookFilter(django_filters.FilterSet):
    class Meta():
        model = Book
        fields = ['title', 'author__first_name', 'author__last_name']

好吧,但除了作者的出生日期,我该如何过滤书籍呢?如何将出生日期添加到BookFilter Meta classEdit中的筛选字段,并输入答案。谢谢!这帮了大忙!这和数字而不是年份是相似的吗?例如lookup_expr='number_ugt'?哦,它只是'gt':)这里有什么帮助吗?