我使用 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似乎有问题。我正在使用:
非常感谢任何帮助。
答案 0 :(得分:2)
Django Rest Framework的BaseSerializer
没有get_fields
功能。你可以在source中看到它。
简答:使用Serializer
,而不是BaseSerializer
。您的代码将工作相同,您不必担心它。如果出于某种原因需要同时使用BaseSerializer
和django-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。