web-dev-qa-db-fra.com

Modification de l'objet sérialiseur Django-rest-framework avant l'enregistrement

Je souhaite modifier un Django-rest-framwork objet sérialiseur avant d'être enregistré. Voici comment je le fais actuellement -

def upload(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid(): # All validation rules pass
             obj = form.save(commit=False)
             obj.user_id = 15
             obj.save()

Comment puis-je le faire avec un Django-rest-framework objet sérialiseur?

@api_view(['POST','GET'])
def upload_serializers(request):
    if request.method == 'POST':
         serializer = FilesSerializer(data=request.DATA, files=request.FILES)
         if serializer.is_valid():
              serializer.save()
38
user680839

Vous pouvez modifier l'objet du sérialiseur avant d'enregistrer le sérialiseur:

if serializer.is_valid():
    serializer.object.user_id = 15 # <----- this line
    serializer.save()
23
zephyr

Maintenant édité pour REST framework

Avec REST framework 3 le modèle est maintenant:

if serializer.is_valid():
    serializer.save(user_id=15)

Notez que les sérialiseurs n'exposent pas maintenant une instance d'objet non enregistrée en tant que serializer.object, mais vous pouvez inspecter les données validées brutes comme serializer.validated_data.

Si vous utilisez les vues génériques et que vous souhaitez modifier le comportement d'enregistrement, vous pouvez utiliser le perform_create et/ou perform_update crochets ...

def perform_create(self, serializer):
    serializer.save(user_id=15)
58
Tom Christie