Django REST框架HyperlinkedModelSerializer

时间:2017-09-20 11:52:52

标签: django django-rest-framework

我正致力于简化如何在我的Djangp应用程序的API中包含不同的模型。以前我设置了它,每个模型都有一个Viewset和一个为它单独定义的Serializer。相反,我正在研究一种更通用的方法,我只需传入模型和相关字段列表,然后自动添加到API中。我目前遇到的问题是定义serializer_class:

from myapp import MyModel
from rest_framework.serializers import HyperlinkedModelSerializer
from rest_framework.viewsets import ModelViewSet

app_name = 'myapp'
fields = ('field1', 'field2', 'field3')
queryset = MyModel.objects.all()

# Problem is here
serializer_class = HyperlinkedModelSerializer(model=MyModel, fields=fields)
viewset = ModelViewSet(queryset=queryset, serializer_class=serializer_class)

# Then to register it all with the router:
self.register(app_name + '/' +  model.__name__, viewset)

我收到错误:

TypeError: __init__() got an unexpected keyword argument 'fields'

问题似乎是在HyperlinkedModelSerializer,' model'和'字段'通常被定义为Meta选项,因此当它们以这种方式提供时似乎不接受它们。

有没有办法实现这个目标?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以定义一个包含许多奇怪内容的特定init,或者使用type动态声明您的课程:

MyMeta = type(
    'Meta',
    [],
    {"model": MyModel, "fields": fields},
)
MyHyperlinkedModelSerializer = type(
    'MyHyperlinkedModelSerializer',
    (HyperlinkedModelSerializer,),
    {'Meta': MyMeta},
)
viewset = ModelViewSet(
    queryset=queryset,
    serializer_class= MyHyperlinkedModelSerializer,
)