Python Django to_表示和过滤器_字段错误:TypeError:';元字段';
目标:能够将_id属性添加到筛选字段中 我试图将名为title的属性的值存储在名为_id的属性中,该属性的输入与title相同,只是小写,没有空格,simple replace(),但我尝试将其实例化为_representation() 当我尝试将_id添加到我的筛选字段时,我会得到下面的错误,将其删除并运行,但我需要添加属性_idPython Django to_表示和过滤器_字段错误:TypeError:';元字段';,python,django,django-models,django-rest-framework,django-filter,Python,Django,Django Models,Django Rest Framework,Django Filter,目标:能够将_id属性添加到筛选字段中 我试图将名为title的属性的值存储在名为_id的属性中,该属性的输入与title相同,只是小写,没有空格,simple replace(),但我尝试将其实例化为_representation() 当我尝试将_id添加到我的筛选字段时,我会得到下面的错误,将其删除并运行,但我需要添加属性_id filter_fields = ('title', '_id',) <--- the _id cause the err 型号.py 课程组合(models
filter_fields = ('title', '_id',) <--- the _id cause the err
型号.py
课程组合(models.Model):
已创建_at=models.DateTimeField()
title=models.CharField(最大长度=255)
description=models.TextField()
link=models.CharField(最大长度=300)
img=models.CharField(最大长度=255)
定义(自我):
返回自己的标题
serializer.py在这里,我试图通过重写到_representation()
类PortfolioSerializer(serializers.ModelSerializer):
类元:
模型=投资组合
字段=('created_at','title','description','link','img',)
def到_表示(自身、实例):
data=super().到_表示(实例)
数据['''u id']=instance.title.lower().replace(“,”)
返回数据
api.py
class PortfolioList(ListAPIView):
queryset=Portfolio.objects.all()
serializer_class=PortfolioSerializer
过滤器\后端=(DjangoFilterBackend,)
筛选器_字段=('title','_id',)
您需要对查询集进行注释,因为\u id
不是模型的一部分。只有在收到query\u参数中的\u id
字段时,才应进行注释
更好的解决方案是实现自定义过滤器后端
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
这里的\u id
是什么?\u id将与title相同,只是小写,没有空格,因此title是Hello World,\u id将是>“Hello\u World”。过滤过程在ORM/DB级别执行。在过滤过程之前,必须对查询集进行注释。为此,请重写视图类的get\u queryset()
方法。感谢我对Django非常陌生,这会出现在我的模型、序列化程序或api中吗?这应该出现在视图中(PortfolioList)。在您的filter\u backends
元组中添加自定义筛选器类。我在filter\u查询方法“PortfolioCustomFilterBackend”对象中的request参数中得到了该类。对象没有属性“request”任何线索?
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