zor*_*ka5 8 django search model filter 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()
Run Code Online (Sandbox Code Playgroud)
所以,我想制作一个过滤页面,您可以在其中通过书籍的属性(标题、作者等)和有关作者的信息找到书籍。例如少于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']
Run Code Online (Sandbox Code Playgroud)
并且实际上不知道如何通过不同的模型进行过滤,这些模型通过外键与图书模型相关。
我对 Dajngo 的经验很少,我想知道这是否是一个非常复杂的问题。:) 谢谢!
基本上每个过滤器有两个重要的参数:
\nfield_name
:要过滤的模型字段的名称。您可以使用 Django\xe2\x80\x99s 语法遍历 \xe2\x80\x9crelationship paths\xe2\x80\x9d__
来过滤相关模型上的字段。前任,author__last_name
。
lookup_expr
:过滤时使用的字段查找。可以再次使用Django\xe2\x80\x99s__
语法来支持查找转换。前任,year__gte
。有关字段查找的完整列表,您可以使用此处查看: https: //docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups。
该字段field_name
和共同lookup_expr
表示一个完整的 Django 查找表达式。Django\xe2\x80\x99s 查找参考中提供了查找表达式的详细说明:https ://docs.djangoproject.com/en/2.2/ref/models/lookups/#module-django.db.models.lookups 。
考虑到这一点,答案如下:
\nimport django_filters\nfrom .models import Book, Author\n\nclass BookFilter(django_filters.FilterSet):\n title = django_filters.CharFilter(field_name=\'title\', lookup_expr=\'iexact\')\n author = django_filters.CharFilter(field_name=\'author__last_name\', lookup_expr=\'iexact\')\n \n class Meta():\n model = Book\n
Run Code Online (Sandbox Code Playgroud)\n如果您想按确切日期过滤,只需添加到您的BookFilter
班级:
date_of_birth = django_filters.DateFilter(field_name=\'author__date_of_birth\', lookup_expr=\'exact\')\n
Run Code Online (Sandbox Code Playgroud)\n然而,按出生年份过滤会更有意义(例如,获取 1980 至 1990 年间出生的作者的所有书籍)。为此,您需要在BookFilter
类中添加以下内容:
birth_year__gt = django_filters.NumberFilter(field_name=\'author__date_of_birth\', lookup_expr=\'year__gt\')\nbirth_year__lt = django_filters.NumberFilter(field_name=\'author__date_of_birth\', lookup_expr=\'year__lt\')\n
Run Code Online (Sandbox Code Playgroud)\n