Django过滤器ForeignKey相关模型过滤

时间:2019-09-18 09:21:26

标签: django search filter model django-filter

我最近一直在努力处理dajngo-filter。我有2种模式:书本和作者。

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']

并且实际上不知道如何也通过不同的模型进行过滤,这由ForeignKey与Book模型相关。

我对Dajngo的了解很少,我想知道这是否是一个非常复杂的问题。 :) 谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

lookup_expr:过滤时要使用的字段查找。可以再次使用Django的__语法来支持查找转换。例如year__gte。有关字段查找的完整列表,请参见https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups

字段field_namelookup_expr共同代表一个完整的Django查找表达式。有关查找表达式的详细说明,请参见Django的查找参考:https://docs.djangoproject.com/en/2.2/ref/models/lookups/#module-django.db.models.lookups

请记住,这是答案:

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')

但是,按出生年份进行过滤会更有意义(例如,从1980年至1990年之间出生的作家那里获得所有书籍)。为此,您可以在BookFilter类中添加以下内容:

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')

答案 1 :(得分:0)

您可以查看django-filter软件包中的the document

  

Meta类中字段序列中的项目可能包含“关系路径”,使用Django的__语法对相关模型上的字段进行过滤。

像这样:

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']