2014-01-28 5 views
7

Ich möchte in der Lage sein, einen Benutzerdatensatz per POST zu aktualisieren. Die ID ist jedoch immer NULL. Selbst wenn ich die ID passieren scheint esdjango Rest Framework - immer INSERTs, nie UPDATES

Code anzeigen ignoriert werden:

JSON ABGEGEBEN:

{ 
    "id": 1, 
    "name": "Craig Champion", 
    "profession": "Developer", 
    "email": "[email protected]" 
} 

@api_view(['POST']) 
def get_purchase(request): 
    """ 
    Gets purchase records for a user 

    Purchase collection is returned 
    """ 

    user = User(); 
    serializer = UserSerializer(user, data=request.DATA) 

    if serializer.is_valid(): 

     #The object ALWAYS has ID = nothing at this point 

     serializer.save() 

     return Response(serializer.data, status=status.HTTP_200_OK) 

    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

ModelSerializer

class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('id', 'name', 'profession', 'email', 'password',) 
     write_only_fields = ('password' ,) 

Modell

class User(models.Model): 
    name = models.CharField(max_length=30, null=True, blank=True) 
    profession = models.CharField(max_length=100, null=True, blank=True) 
    email = models.EmailField() 
    password = models.CharField(max_length=20, null=True, blank=True) 


    def __unicode__(self): 
     return self.name 

Wie kann Ich zwinge den e Savechanges zu aktualisieren und die ID zu sehen?

Antwort

12

Sie müssen partial=True verwenden, um eine Reihe mit Teildaten zu aktualisieren:

serializer = UserSerializer(user, data=request.DATA, partial=True) 

Von docs:

Standardmäßig müssen Serializer für alle erforderlichen Felder übergebenen Werte werden oder sie werden werfen Validierungsfehler Sie können das partial Argument verwenden, um Teilupdates zuzulassen.

+0

Das repariert es nicht. Das Problem ist, dass beim Initialisieren von UserSerializer die ID nicht an das Objekt übergeben wird. Es ist immer Nothing (oder null) –

+2

@ISAIMobile Durch den Aufruf von 'User()' erstellen Sie ein neues Benutzerobjekt. Um einen bereits vorhandenen Benutzer zu aktualisieren, rufen Sie diesen Benutzer zuerst mit einer 'User.objects.get'-Abfrage ab und übergeben diese dann an den Serializer mit' partially = True'. –

+0

Danke dafür, aber wie extrahiere ich die ID des Benutzers von request.DATA? –

Verwandte Themen