Django-filterforeignKey相关Model过滤

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 的经验很少,我想知道这是否是一个非常复杂的问题。:) 谢谢!

Ton*_*vić 8

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

\n

field_name:要过滤的模型字段的名称。您可以使用 Django\xe2\x80\x99s 语法遍历 \xe2\x80\x9crelationship paths\xe2\x80\x9d__来过滤相关模型上的字段。前任,author__last_name

\n

lookup_expr:过滤时使用的字段查找。可以再次使用Django\xe2\x80\x99s__语法来支持查找转换。前任,year__gte。有关字段查找的完整列表,您可以使用此处查看: https: //docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups

\n

该字段field_name和共同lookup_expr表示一个完整的 Django 查找表达式。Django\xe2\x80\x99s 查找参考中提供了查找表达式的详细说明:https ://docs.djangoproject.com/en/2.2/ref/models/lookups/#module-django.db.models.lookups 。

\n

考虑到这一点,答案如下:

\n
import 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班级:

\n
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类中添加以下内容:

\n
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