我最近一直在努力处理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的了解很少,我想知道这是否是一个非常复杂的问题。 :) 谢谢!
答案 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_name
和lookup_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']