2017-09-20 6 views
0

Ich arbeite an der Straffung, wie ich verschiedene Modelle in der API für meine Djangp-App einbinden. Zuvor hatte ich es eingestellt, wo jedes Modell ein Viewset und einen separat definierten Serializer hatte. Stattdessen arbeite ich an einer allgemeineren Methode, bei der ich nur ein Modell und eine Liste relevanter Felder übergebe und automatisch zur API hinzugefügt werde. Das Problem, das ich in renne derzeit mit Definition der serializer_class:Django REST-Framework 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) 

ich den Fehler:

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

Das Problem scheint, dass in HyperlinkedModelSerializer zu sein, 'Modell' und 'Felder' sind normalerweise als Meta-Optionen definiert, so scheint es nicht zu akzeptieren, wenn sie auf diese Weise bereitgestellt werden.

Gibt es einen Weg, dies zu erreichen?

Danke.

Antwort

0

Sie wahrscheinlich eine bestimmte init mit viel seltsame Dinge definieren könnte oder Ihre Klasse auf dem mit type fly erklären:

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

Zeile 3: Nameerror: name ‚Meta‘ definiert ist, nicht – Ben

+0

wooops, Ich habe vergessen, dass die Meta-Klasse nichts erbt. Beitrag aktualisiert. – Linovia

+0

Hm, das Problem, das ich jetzt bekomme, ist, wenn ich versuche, es zu registrieren: self.register (app_name + '/' + Modell .__ name__, viewset) Es wird eine Menge Fehler angezeigt, aber ich denke, es kommt herunter an: AttributeError: Diese Methode ist nur für die Klasse verfügbar, nicht für Instanzen. – Ben

Verwandte Themen