filterset_class 中的特定字段

Specific field in filterset_class

我有学生模型,我需要使用 filterset_class

过滤没有私人教练的学生
models.py

class Student(models.Model):
    personal_trainer = models.ForeignKey(PersonalTrainer, on_delete=models.CASCADE, blank=True, null=True)

views.py

class StudentsView(ReadOnlyModelViewSet):
    permission_classes = [IsAuthenticated]
    serializer_class = StudentsSerializer
    lookup_field = "pk"
    pagination_class = None

这里是 views.py

class StudentFilter(rest_framework.FilterSet):
    has_personal_trainer = rest_framework.BooleanFilter(field_name="personal_trainer", lookup_expr="isnull")

    class Meta:
        model = Student
        fields = ("has_personal_trainer")

class StudentsView(ReadOnlyModelViewSet):
    permission_classes = [IsAuthenticated]
    serializer_class = StudentsSerializer
    lookup_field = "pk"
    pagination_class = None
    filter_backends = (rest_framework.DjangoFilterBackend,)
    filterset_class = StudentFilter

当我将请求与 api/students?care_navigator=false 一起使用时,它给了我以下错误消息

`django.core.exceptions.FieldError: Cannot resolve keyword 'has_personal_trainer' into field. Choices are: personal_trainer, personal_trainer_id`

等...

您可以使用 FilterSet class.

from django_filters import rest_framework

class StudentFilter(rest_framework.FilterSet):
    has_personal_trainer = rest_framework.BooleanFilter(field_name="personal_trainer", lookup_expr="isnull")

    class Meta:
        model = Student
        fields = ("has_personal_trainer",)

在views.py

from django_filters import rest_framework

class StudentsView(ReadOnlyModelViewSet):
    permission_classes = [IsAuthenticated]
    serializer_class = StudentsSerializer
    lookup_field = "pk"
    pagination_class = None
    filter_backends = (rest_framework.DjangoFilterBackend,)
    filterset_class = StudentFilter

用法 api/students?has_personal_trainer=trueapi/students?has_personal_trainer=false