2013-10-18 6 views
7

Wir erstellen eine API, die es einem Benutzer ermöglichen muss, einen Datensatz zu aktualisieren. In vielen Fällen, wie bei einer Statusaktualisierung oder Namensänderung, ändert sich nur ein Feld. Dies scheint ein geeignetes Anwendungsszenario für eine PATCH-Anfrage zu sein. Wie ich es verstehe, ist dies eine "teilweise" Aktualisierung.Django REST Framework-PATCH schlägt auf erforderliche Felder fehl

Wir haben Djangos REST-Framework implementiert und stoßen auf dieses Problem. Für einen Datensatz wie einen "AccountUser" möchte ich nur ein Namensfeld ändern, damit ich die folgende Anfrage senden kann: PATCH/api/users/1/HTTP/1.1 Host: localhost X-CSRFToken: 111122223333444455556666 Content-Type : application/json; charset = UTF-8 Cache-Control: no-cache

{ "fullname": "John Doe" } 

der Datensatz hat offensichtlich andere Attribute ein paar 'verbunden sind' Felder wie 'Konto' enthält, die für eine neue erforderlich ist Aufzeichnung. Wenn die Anforderung gesendet wird, lautet die Antwort 400 mit dem folgenden Text: {"account": ["Dieses Feld ist erforderlich." ]} Der Serializer für den Benutzer wie folgt aussieht:

class AccountUserSerializer(serializers.ModelSerializer): 
    account = serializers.PrimaryKeyRelatedField() 

class Meta: 
    model = AccountUser 
    fields = ('id', 'account', 'fullname', ...) 
    depth = 1 

Und das Modell sieht wie folgt aus:

class AccountUser(models.Model): 
    ''' Account User''' 
    fullname = models.CharField(max_length=200, 
     null=True,blank=True) 
    account = models.ForeignKey(Account, 
     on_delete=models.PROTECT 
     ) 

    objects = AccountUserManager() 

    def __unicode__(self): 
     return self.email 

    class Meta: 
     db_table = 'accounts_account_user' 

Ich aktualisiere tue hier etwas falsch oder ist es falsch erwarten zu können, ein einzelnes Feld auf einem Datensatz auf diese Weise. Vielen Dank! Diese Gemeinschaft rockt!

EDIT: Gewünscht - AccountUserManager:

class AccountUserManager(BaseUserManager): 

    def create_user(self, email, account_name): 
     username = hash_email_into_username(email) 
     ... 
     account = Account.objects.get(name=account_name) 
     account_user = AccountUser(email=email,user=user,account=account) 
     account_user.save() 
     return account_user 
+0

Versuchen Hinzufügen eines 'related_name = 'account'' in' models.ForeignKey (Account sehen, .. ' –

+0

Das ist nur für Reverse-Lookups auf dem' Account' Modell. –

+0

Can Du postest deinen 'AccountUserManager'? Ich vermute, das Problem ist, dass der Manager das Objekt bei' pk = 1' nicht zurückgibt und dein Patch-Aufruf (der 'partial_update' aufruft) denkt, dass er eine neue Instanz erstellen muss. –

Antwort

1

Es sieht nicht wie Ihr Manager den Benutzer filtert. Ich würde Sie ermutigen, pdb zu verwenden und einen Haltepunkt in Ihrem Ansichtscode zu setzen, um zu sehen, warum er versucht, einen neuen Datensatz zu erstellen. Ich kann garantieren, dass wir PATCH verwenden, um die ganze Zeit partielle Updates durchzuführen und nur ein paar Felder zu senden, die ohne Probleme aktualisiert werden können.

Nur anderer Gedanke ist, dass Sie einige sind, wie ein Wert für account (wie null) sendet das ist das Auslösen der Validierungsfehler, obwohl Sie Beispiel aufgeführt sind, nur die tatsächlich fullname Feld zu schicken.

0

Siehe meine answer über teilweise Updates. Auch können Sie die DRF docs und diese eine docs