1

我正在尝试实现drf-spectacular现有的 Django REST API。

但是,尝试运行时出现以下错误

./manage.py spectacular --file schema.yml

错误:

python3.7/site-packages/django_filters/filterset.py", line 352, in get_filters
    "%s" % ', '.join(undefined)
TypeError: 'Meta.fields' contains fields that are not defined on this FilterSet: client, tenant_id, subtenant_id, data_stream_id

过滤器确实有效,但似乎不能很好地与 drf-spectacular lib 配合使用。谁能建议如何解决这个问题?

规格如下:

Python                3.7.2
Django                3.0.2    
django-filter         2.2.0    
django-rest-framework 0.1.0    
djangorestframework   3.12.1   
drf-spectacular       0.12.0 

视图集示例:

class subModelViewSet(viewsets.ModelViewSet):
    """Standard ViewSet for the DataStream Model."""
    queryset = DataStream.objects.all()
    serializer_class = DataStreamSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ('client', 'tenant_id', 'subtenant_id', 'data_stream_id',)

序列化器示例:

class DataStreamSerializer(serializers.ModelSerializer):
    """Class to validate an uploaded DataStream."""

    class Meta:
        """Nested Meta Class."""

        model = DataStream
        fields = '__all__'
4

1 回答 1

1

事实证明,这是一个试图将 filterset_fields 应用于subModel不直接包含这些字段,而是由另一个父模型上的 ForeignKey 引用的视图集。虽然我认为这些过滤器按预期工作,但我认为在这种情况下,对这些字段的实际过滤是由中间件执行的。

从 Viewset 中删除字段可以毫无问题地生成架构。我能够访问完全呈现的 /docs 页面和 /schema 端点工作。至今印象深刻drf-spectacular

示例模型:

class DataSteam(models.Model):
    """Class for DataSteam Model."""
    client = models.CharField(max_length=200)
    tenant_id = models.CharField(max_length=200)
    subtenant_id = models.CharField(max_length=200)
    data_stream_id = models.CharField(max_length=200)

class subModel(models.Parent):
    """Class for storing linked datastream records."""
    ds = models.ForeignKey(DataStream, on_delete=models.CASCADE) 
于 2021-01-12T07:03:21.313 回答