Swagger没有使用Django BaseSerializer对象

时间:2015-06-17 00:22:19

标签: python django rest django-rest-framework swagger

我使用 django-rest-swagger 来记录和测试API,到目前为止它一直运行良好,但发生了以下错误:

/ docs / api-docs / app上的

AttributeError ' PeriodSerializer'对象没有属性' get_fields'

' PeriodSerializer'继承自serializers.BaseSerializer:

class PeriodSerializer(serializers.BaseSerializer):

    def to_representation(self, instance):
        return {
            'lower': instance.lower,
            'upper': instance.upper
        }

    def to_internal_value(self, data):
        data = json.loads(data)

        date_lower = self.date_from_str(data["lower"])
        date_upper = self.date_from_str(data["upper"])

        # some code omitted for brevity

        return DateTimeTZRange(lower=date_lower, upper=date_upper)


    @staticmethod
    def date_from_str(datestr):
        # code omitted for brevity

代码本身运行正常,只是django-rest-swagger似乎有问题。我正在使用:

  • Python 3.4.0
  • Django 1.8.2
  • DRF 3.1.3
  • django-rest-swagger 0.3.2

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

Django Rest Framework的BaseSerializer没有get_fields功能。你可以在source中看到它。

简答:使用Serializer,而不是BaseSerializer。您的代码将工作相同,您不必担心它。如果出于某种原因需要同时使用BaseSerializerdjango-rest-swagger,则必须自己实施get_fields

如果你看一下更高级别的序列化器(例如Serializer)中get_fields的实现,你会看到get_fields的定义如下:

def get_fields(self):
    """
    Returns a dictionary of {field_name: field_instance}.
    """
    # Every new serializer is created with a clone of the field instances.
    # This allows users to dynamically modify the fields on a serializer
    # instance without affecting every other serializer class.
    return copy.deepcopy(self._declared_fields)

使用BaseSerializer,您也无法访问self._declared_fields。您可以在上面的链接源中看到它是如何工作的,但它的要点是它返回Field类型的属性字典。

  

Field的任何实例都包含在类的属性中       或其任何超类将包括在       _declared_fields字典。

我希望这有助于回答你的问题!

答案 1 :(得分:1)

虽然晚会很晚但对我有用的东西是这样的:

@six.add_metaclass(serializers.SerializerMetaclass)
class PeriodSerializer(serializers.BaseSerializer):

    def get_fields(self):
        """
        Returns a dictionary of {field_name: field_instance}.
        """
        # Every new serializer is created with a clone of the field instances.
        # This allows users to dynamically modify the fields on a serializer
        # instance without affecting every other serializer class.
        return copy.deepcopy(self._declared_fields)

即你需要使用提供_declared_field的元类来装饰类,然后你可以实现这个方法。

答案 2 :(得分:0)

您也可以尝试drf-yasg。这是另一个摇摇欲坠的生成器,支持较新版本的Django Rest Framework。