python - 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',)
解决方案
您需要注释您的查询集,因为_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
推荐阅读
- json - pytest - 访问烧瓶响应参数
- python - Django REST:ViewSet 自定义字典
- bash - 如何在没有前导换行符的情况下在文本文件末尾附加字符串?
- java - Java Android Studio - 单击按钮时引发异常
- swift - SWTO 到 x iOS 翻译
- python - Leapfrog 算法用于计算围绕中心体的引力场中的物体轨迹(Python 3.8.2)
- python - 列出支持虚拟网络的 azure 位置
- javascript - 如何使用forEach循环更改数组内的对象内的元素
- java - 在开始升序时具有特定元素的排序集
- python - complex() 与数组