Passer contexte de demande de sérialiseur de Viewset dans Django Repos Cadre
J'ai un cas où les valeurs d'un sérialiseur de champ dépend de l'identité de l'utilisateur actuellement connecté. J'ai vu comment faire pour ajouter l'utilisateur au contexte lors de l'initialisation d'un sérialiseur, mais je ne suis pas sûr de la façon de le faire lors de l'utilisation d'un ViewSet, comme vous ne l'approvisionnement de la sérialiseur de classe et non pas le sérialiseur instance.
Fondamentalement, je voudrais savoir comment passer d':
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
à:
class myModelSerializer(serializers.ModelSerializer):
uploaded_by = serializers.SerializerMethodField()
special_field = serializers.SerializerMethodField()
class Meta:
model = myModel
def get_special_field(self, obj):
if self.context['request'].user.has_perm('something.add_something'):
return something
Désolé si c'était pas clair, à partir de la documentation:
Ajouter Du Contexte
Qui a dit de le faire
serializer = AccountSerializer(account, context={'request': request})
serializer.data
Mais je ne suis pas sûr de savoir comment le faire automatiquement à partir de la viewset, que je ne peux changer le sérialiseur de classe, et non pas le processus de l'instance elle-même.
- Avez-vous essayé
self.context.get('request').user.has_perm("some.permission")
? - Voulez-vous
something
être retourné avec d'autres domaines de processus de la production? - Désolé si c'était pas clair, le problème est que l'auto.le contexte est vide dans le sérialiseur.
AccountSerializer(account, context={'request': request})
était tout ce dont j'avais besoin pour mon but
Vous devez vous connecter pour publier un commentaire.
GenericViewSet
a laget_serializer_context
méthode, vous pouvez remplacer:NameError: name 'request' is not defined
self.request
?self.request
dans le contexte par défaut envoyé à sérialiseurs; vous n'avez pas besoin de l'ajouter manuellement dans.Retour parent contexte en fonction surdéfinie
get_serializer_context
, il sera facile d'accéder à la demande et de ses données.C'est très stable, comme à chaque fois nous demande viewset, il retourne contexte.
suffit d'utiliser get_serializer() dans votre viewsets
C'est comment je gère de tels cas dans mon ModelViewSet: