2013-10-18 12 views
7

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 
+0

Spróbuj dodać 'related_name = 'account'' w' models.ForeignKey (rachunek .. ' –

+0

To tylko dla wyszukiwania wstecznego na' modelu rozliczeniowa. –

+0

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ę. –

Odpowiedz

1

To nie wygląda jak menedżer jest filtrowanie użytkownika. Zachęcam do korzystania z pdb i ustawiania punktu przerwania w kodzie widoku i krok po kroku, aby zobaczyć, dlaczego próbuje utworzyć nowy rekord. Mogę ręczyć za to, że używamy PATCH do uzupełniania częściowych aktualizacji przez cały czas i wysyłamy tylko kilka pól do aktualizacji bez problemu.

Tylko inna myśl, że jesteś trochę jak wysyłanie wartość account (jak null), który jest wyzwolenie błędu walidacji chociaż jesteś wymieniony przykład pokazuje tylko wysyłanie pole fullname.

0

Zobacz mój answer o częściowych aktualizacjach. Ponadto można zobaczyć DRF docs a ten docs

Powiązane problemy