Django Rest Framework相关字段过滤

时间:2017-01-24 11:51:19

标签: python django django-rest-framework

我刚开始在DRF编码,我遇到了一个问题,我必须从相关的外键搜索。

我有2个模型,BookDetails和BookCopies。

BookCopies将BookDetails作为外键引用。

现在我想使用模型BookDetails中的属性标题搜索BookCopies。

我使用了django_rest_framework_filters,但是当我访问http://localhost:8000/book/copy/?book_details__title=abc时出现错误。

SELECT * FROM Customers WHERE City IN ('Paris','Berlin','Mannheim','London') AND CustomerID BETWEEN 10 AND 20

查看

class BookFilter(FilterSet):
    class Meta:
        model = BookDetail
        fields = {
            'title': ['exact', 'in', 'startswith'],
            'author': ['exact', 'in', 'startswith'],
            'editor': ['exact', 'in', 'startswith'],
            'publisher': ['exact', 'in', 'startswith'],
            'cl_num': ['exact', 'in', 'startswith']
        }


class CopyFilter(FilterSet):
    book_details = RelatedFilter(BookFilter, name="title",  queryset=BookDetail.objects.all())

    class Meta:
        model = BookCopy
        fields = {
            'ref_id': ['exact', 'in', 'startswith']
        }

Serializer

class CopyListAPIView(ListAPIView):
    serializer_class = CopyViewSerializer
    queryset = BookCopy.active_objects.all()
    filter_backends = [DjangoFilterBackend]
    filter_class = CopyFilter

错误跟踪

class CopyViewSerializer(ModelSerializer):
    class Meta:
        model = BookCopy
        fields = "__all__"

请帮助。谢谢

1 个答案:

答案 0 :(得分:0)

要获得所需的行为,您需要在模型中提供等于name的{​​{1}}参数。默认情况下,它等于FilterSet中的字段名称。因此,如果是related_name,您可以跳过它。

book_details

顺便说一下,你的错误堆栈中没有堆栈。