我正致力于简化如何在我的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选项,因此当它们以这种方式提供时似乎不接受它们。
有没有办法实现这个目标?
感谢。
答案 0 :(得分:0)
您可以定义一个包含许多奇怪内容的特定init,或者使用type
动态声明您的课程:
MyMeta = type(
'Meta',
[],
{"model": MyModel, "fields": fields},
)
MyHyperlinkedModelSerializer = type(
'MyHyperlinkedModelSerializer',
(HyperlinkedModelSerializer,),
{'Meta': MyMeta},
)
viewset = ModelViewSet(
queryset=queryset,
serializer_class= MyHyperlinkedModelSerializer,
)