2017-09-20 249 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