首页 > 解决方案 > Django to_representation 和 filter_fields 错误:TypeError: 'Meta.fields'

问题描述

目标:能够将 _id 属性添加到 filter_fields

我正在尝试将名为title的属性的存储在名为_id的属性中,该属性与title的输入相同,只是小写且没有空格,简单的replace(),但我尝试将其实例化为_representation()。

当我尝试将 _id 添加到我的 filter_fields 时,我得到下面的错误,将其删除并运行,但我需要属性 _id

filter_fields = ('title', '_id',) <--- the _id cause the err
TypeError: 'Meta.fields' contains fields that are not defined on this FilterSet: _id

模型.py

class Portfolio(models.Model):
    created_at = models.DateTimeField()
    title = models.CharField(max_length=255)
    description = models.TextField()
    link = models.CharField(max_length=300)
    img = models.CharField(max_length=255)

    def __str__(self):
        return self.title

这里的serializer.py是我尝试通过覆盖to_representation()来实例化它的地方

class PortfolioSerializer(serializers.ModelSerializer):
    class Meta:
        model = Portfolio
        fields = ('created_at', 'title', 'description', 'link', 'img', )

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['_id'] = instance.title.lower().replace(" ", "_")
        return data

api.py

class PortfolioList(ListAPIView):
    queryset = Portfolio.objects.all()
    serializer_class = PortfolioSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('title', '_id',)

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-filter

解决方案


您需要注释您的查询集,因为_id它不是模型的一部分。您应该只在收到_id字段中的字段时进行注释query_params

更好的解决方案是实现自定义过滤器后端。

    class PortfolioCustomFilterBackend(filters.BaseFilterBackend):

        def filter_queryset(self, request, queryset, view):
            _id = self.request.query_params.get('_id', None)
            if _id is not None:
                title = _id.replace('_', ' ')
                queryset = queryset.filter(title__iexact=title)
            return queryset

推荐阅读