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
Versuchen Hinzufügen eines 'related_name = 'account'' in' models.ForeignKey (Account sehen, .. ' –
Das ist nur für Reverse-Lookups auf dem' Account' Modell. –
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. –