2016-08-04 13 views
2

Ich mag würde ein willkürliches Field auf einem django-Rest-RahmenSerializer, die auf dem nicht existiert definieren Django Model.Definieren Sie ein beliebiges Feld auf einem django-Rest-Rahmen Serializer, die nicht auf dem Django Modell existiert

Mein Code sieht so aus:

class Person(models.Model): 
    pass 

class PersonSerializer(serializers.ModelSerializer): 

    foo = serializers.CharField() 

    class Meta: 
     model = Person 
     fields = ('id', 'foo') 

class PersonViewSet(viewsets.ModelViewSet): 

    queryset = Person.objects.all() 
    serializer_class = PersonSerializer 

Dieser Code schlägt mit:

AttributeError: Got AttributeError when attempting to get a value for field `key` on serializer `PersonSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `Person` instance. 
Original exception text was: 'Person' object has no attribute 'key'. 

Aber ... Wenn ich die Person Klasse darauf einstellen:

class Person(models.Model): 

    def foo(self): 
     pass 

Dann Ich bekomme den Fehler nicht, und ich kann die Daten POST.

Ich mag die Idee nicht, eine Dummy-Methode auf der Person Klasse zu schaffen, um diesen Fehler zu erhalten. Gibt es eine django-rest-framework Möglichkeit, diesen Fehler zu beheben, den ich verpasst habe?

Antwort

1

Man könnte es so machen, eine mit SerializerMethodField:

class PersonSerializer(serializers.ModelSerializer): 

    foo = serializers.SerializerMethodField() 

    ... 

    def get_foo(self, obj): 
     return 'the foo' 

Dann ist die Logik, wie das zusätzliche Feld serialisiert nur selbst auf dem Serializer lebt, aber tut es Zugriff auf die Instanz haben, falls erforderlich , durch obj.