2017-09-20 2 views
0

Djangp 앱의 API에 다른 모델을 포함시키는 방법을 간소화하려고합니다. 이전에는 각 모델에 Viewset 및 Serializer가 별도로 정의되어있는 곳에 설정했습니다. 대신 모델과 관련 필드 목록을 전달하는보다 일반적인 방법을 사용하고 API에 자동으로 추가됩니다.Django REST 프레임 워크 HyperlinkedModelSerializer

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

문제는 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) 

: 나는에서 실행 해요 문제는 현재 serializer_class을 정의 함께합니다 은 일반적으로 메타 옵션으로 정의되므로 이러한 방식으로 제공 될 때이를 받아들이지 않는 것 같습니다.

이 방법이 있습니까?

감사합니다.

답변

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, 메타 클래스가 아무 것도 상속받지 못한다는 사실을 잊어 버렸습니다. 소식이 업데이트되었습니다. – Linovia

+0

흠, 이제 문제는 등록하려고 할 때입니다. self.register (app_name + '/'+ model .__ name__, viewset) 표시되는 오류는 많지만 발생한다고 생각합니다. 대상 : AttributeError :이 메서드는 클래스가 아닌 인스턴스에서만 사용할 수 있습니다. – Ben

관련 문제