2017-09-20 96 views
0

我正在精简如何在API中为我的Djangp应用程序包含不同的模型。以前,我将它设置在每个模型都有一个Viewset和一个Serializer分别定义的位置。相反,我正在研究一种更通用的方法,即只传入模型和相关字段列表,并将自动添加到API中。我跑的问题目前是定义serializer_class:Django REST框架HyperlinkedModelSerializer

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,“模型”和“场”通常被定义为元选项,所以当它们以这种方式提供时,似乎并不接受它们。

有没有办法做到这一点?

谢谢。

回答

0

你也许可以定义一个特定的init了很多奇怪的事情或宣布与type飞行类:

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

线路3: NameError:名字“元”是没有定义 – Ben

+0

wooops,忘了Meta类没有继承任何东西。发布更新。 – Linovia

+0

嗯,我现在得到的问题是,当我尝试注册它: self.register(APP_NAME +“/” +模型.__ name__,视图集) 有显示了很多的错误,但我认为它归结到: AttributeError:此方法仅适用于类,不适用于实例。 – Ben