Rest-Framework Serializer Methode
Habe ich Folgendes Serializer mit der Django REST Framework.
Dies ist, was ich habe, so weit...
serializer.py
class ProductSerializer(serializers.ModelSerializer):
score = serializers.SerializerMethodField('get_this_score')
class Meta:
model = Product
fields = ('id', 'title', 'active', 'score')
def get_this_score(self, obj):
profile = Profile.objects.get(pk=19)
score = [val for val in obj.attribute_answers.all() if val in profile.attribute_answers.all()]
return (len(score))
urls.py
url(r'^products/(?P<profile_id>.+)/$', ProductListScore.as_view(), name='product-list-score'),
Gibt es ein paar Probleme mit diesem code-snippet.
1) Der Kinderwagen pk=19 ist fest es sein sollte self.kwargs['profile_id'].
ich habe versucht und versucht, aber ich weiß nicht, wie pass kwarg in die Methode und kann nicht profile_id zu arbeiten. d.h. ich kann es nicht aus der url.
2) Sollte eine der in diesem code werden in den Modellen? Ich habe versucht, das hinzufügen, um Modelle, sondern kann wieder übergeben args.
models.py
D. H. Methode, Klasse
def get_score(self, profile):
score = [val for val in self.attribute_answers.all() if val in
profile.attribute_answers.all()]
return len(score)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Serialisierungsprogramme übergeben werden, ein Kontext-Wörterbuch, enthält die view-Instanz, so könnte man das profile_id von etwas wie dies:
Aber in diesem Fall denke ich nicht, dass Sie brauchen, um zu tun, die als 'obj' wird in jedem Fall festgelegt werden, um die Profil-Instanz.
Und ja, Sie könnte die 'get_this_score' - Methode der model-Klasse statt. Sie müssen noch die 'SerializerMethodField', aber es würde einfach anrufen 'return obj.get_this_score(...)', irgendwelche Argumente aus dem serializer Kontext.
Beachten Sie, dass der serializer Kontext gehören auch die 'Anfrage', so können Sie auch auf Anfrage.Benutzer', wenn nötig.
However in this case I don't think you need to do that as 'obj' will in any case be set to the profile instance
meinst duProduct
Beispiel vielleicht?Beantworten Jasons Frage-Antwort auf Tom ' s Antwort Sie Zugriff auf das request-Objekt über die gleiche Kontext-Mechanismus wie so. Verweisen Sie auf den Anfrage-Objekten aus der ModelMethod definition, Sie nicht weiterzugeben. Ich war in der Lage, verwenden Sie diese, um Zugriff auf die aktuelle Anfrage.Benutzer-Objekt, wie unten:
return Response({'data':ProductSerializer(user_profiles,many=True).data})
ich bin immer keyerror Anfrage