Tworzymy interfejs API, który musi umożliwiać użytkownikowi aktualizację rekordu. W wielu przypadkach, jak aktualizacja statusu lub zmiana nazwy, zmieni się tylko jedno pole. Wydaje się to odpowiednim scenariuszem użycia dla żądania PATCH. Jak rozumiem, jest to aktualizacja "częściowa".Django REST Framework PATCH kończy się niepowodzeniem na wymaganych polach
Wdrożyliśmy framework REST Django i uruchomiliśmy ten problem. W przypadku rekordu, takiego jak "AccountUser", chcę zmienić tylko pole nazwy, dlatego wysyłam następujące żądanie: 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" }
rekord oczywiście ma inne atrybuty w tym kilku 'powiązanych' dziedzinach, takich jak 'rachunek', które jest wymagane dla nowego rekord. Po przesłaniu żądania odpowiedź jest błędem 400 z następującym treścią: {"account": ["To pole jest wymagane." ]} serializer dla użytkownika wygląda następująco:
class AccountUserSerializer(serializers.ModelSerializer):
account = serializers.PrimaryKeyRelatedField()
class Meta:
model = AccountUser
fields = ('id', 'account', 'fullname', ...)
depth = 1
A model wygląda następująco:
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'
Czy robię coś źle tutaj lub jest to źle się spodziewać, aby móc aktualizować pojedyncze pole na płycie w ten sposób. Dzięki! Ta społeczność kołysze!
EDIT: Zamówiony - 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
Spróbuj dodać 'related_name = 'account'' w' models.ForeignKey (rachunek .. ' –
To tylko dla wyszukiwania wstecznego na' modelu rozliczeniowa. –
Can opublikujesz 'AccountUserManager'? Zgaduję, że problem polega na tym, że menedżer nie zwraca obiektu w' pk = 1', więc twoje wywołanie poprawki (które wywołuje 'partial_update') uważa, że musi utworzyć nową instancję. –