Django-filter error: 'Meta.fields' must not contain non-model field names
Django-filter error: 'Meta.fields' must not contain non-model field names
我正在使用 Django REST 框架和 django-filters,我想使用反向关系 annotation_set
作为 GET
API 使用的过滤器之一模型 Detection
。
型号如下:
class Detection(models.Model):
image = models.ImageField(upload_to="detections/images")
def local_image_path(self):
return os.path.join('images' f"{self.id}.jpg")
class Annotation(models.Model):
detection = models.ForeignKey(Detection, on_delete=models.CASCADE)
attribute = models.CharField(max_length=255)
序列化器是:
class DetectionSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
local_image_path = serializers.CharField()
class Meta:
model = Detection
fields = '__all__'
视图集是:
class DetectionTrainingViewSet(
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
queryset = Detection.objects.all()
serializer_class = DetectionSerializer
filterset_fields = ('annotation_set__id', )
@action(methods=['GET'], detail=False)
def list_ids(self, request):
queryset = self.get_queryset()
filtered_queryset = self.filter_queryset(queryset)
return Response(filtered_queryset.values_list('id', flat=True))
当我调用端点时,出现错误:
'Meta.fields' must not contain non-model field names: annotation_set__id
该字段不应该存在吗?
注意:我尝试将其他字段添加到 Annotation
模型,然后使用 annotation_set__newfield
但我仍然有错误。当我注释掉设置 filterset_fields
.
的行时,我可以确认 newfield
存在,因为它被 API 正确序列化并且 return
查看 django 过滤器文档,您可能错过了对 DjangoFilterBackend 的引用,例如
queryset = Detection.objects.all()
serializer_class = DetectionSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ('annotation_set__id', )
(参见:https://django-filter.readthedocs.io/en/stable/guide/rest_framework.html)
显然我必须明确说明反向关系的名称:
class Annotation(models.Model):
detection = models.ForeignKey(Detection, on_delete=models.CASCADE, related_name='annotation_set')
attribute = models.CharField(max_length=255)
如果有人知道原因,我很想知道!谢谢!
我正在使用 Django REST 框架和 django-filters,我想使用反向关系 annotation_set
作为 GET
API 使用的过滤器之一模型 Detection
。
型号如下:
class Detection(models.Model):
image = models.ImageField(upload_to="detections/images")
def local_image_path(self):
return os.path.join('images' f"{self.id}.jpg")
class Annotation(models.Model):
detection = models.ForeignKey(Detection, on_delete=models.CASCADE)
attribute = models.CharField(max_length=255)
序列化器是:
class DetectionSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
local_image_path = serializers.CharField()
class Meta:
model = Detection
fields = '__all__'
视图集是:
class DetectionTrainingViewSet(
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet
):
queryset = Detection.objects.all()
serializer_class = DetectionSerializer
filterset_fields = ('annotation_set__id', )
@action(methods=['GET'], detail=False)
def list_ids(self, request):
queryset = self.get_queryset()
filtered_queryset = self.filter_queryset(queryset)
return Response(filtered_queryset.values_list('id', flat=True))
当我调用端点时,出现错误:
'Meta.fields' must not contain non-model field names: annotation_set__id
该字段不应该存在吗?
注意:我尝试将其他字段添加到 Annotation
模型,然后使用 annotation_set__newfield
但我仍然有错误。当我注释掉设置 filterset_fields
.
newfield
存在,因为它被 API 正确序列化并且 return
查看 django 过滤器文档,您可能错过了对 DjangoFilterBackend 的引用,例如
queryset = Detection.objects.all()
serializer_class = DetectionSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ('annotation_set__id', )
(参见:https://django-filter.readthedocs.io/en/stable/guide/rest_framework.html)
显然我必须明确说明反向关系的名称:
class Annotation(models.Model):
detection = models.ForeignKey(Detection, on_delete=models.CASCADE, related_name='annotation_set')
attribute = models.CharField(max_length=255)
如果有人知道原因,我很想知道!谢谢!