2013-08-22 4 views
6

Sto cercando di creare una visualizzazione di aggiornamento di massa per un modello specifico utilizzando Django Rest Framework. A breve termine, è sufficiente aggiornare un campo (alternando un invito da submit = False a submitted = True), ma mi piacerebbe che fosse in grado di fornire più funzionalità in futuro. Ogni volta che provo la vista, tuttavia, viene creato un nuovo oggetto anziché quello corrente che viene modificato.Aggiornamento bulk di Django Rest Framework che inserisce invece di aggiornare

Credo che questo debba essere un semplice errore da parte mia, ma non riesco a capire cosa sta succedendo. Sembra che l'oggetto serializzatore stia ignorando il valore di "id" passato attraverso JSON, che potrebbe contribuire al problema. Il codice corrente è:

class InviteBulkUpdateView(generics.UpdateAPIView): 
    def get_queryset(self): 
     order = self.kwargs['order'] 
     invite = get_objects_for_user(self.request.user, 'sourcing.view_invite') 
     return invite.filter(order=order) 

    serializer_class = InviteInputSerializer 

    def put(self, request, *args, **kwargs): 
     data = request.DATA 
     serializer = InviteInputSerializer(data=data, many=True) 

     if serializer.is_valid(): 
      serializer.save() 
      return Response(status=status.HTTP_200_OK) 
     else: 
      return Response(status=status.HTTP_400_BAD_REQUEST) 

class InviteInputSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Invite 
     fields = ('id', 'order', 'team', 'submitted') 

Qualcuno può far luce su ciò che potrei fare male?

risposta

4

La cosa ovvia che si apre è che non si passano istanze di oggetti al serializzatore. (Così sarà creare nuove istanze piuttosto che di aggiornamento.) Vedere la docs on dealing with multiple objects in serializers dove vedrete il vostro QuerySet passato in.

+0

Avevi ragione; il pezzo mancante stava impostando il queryset. Non sono sicuro di cosa ho modificato da un precedente tentativo, ma prima del mio post avevo tentato di passare in un queryset e ho ricevuto un errore dicendo che serializer.save() non era un attributo, quindi ho pensato che causasse il problema. Ho funzionato, grazie! – user2708386

7

Solo nel caso qualcuno è alla ricerca di una libreria per gestire questo, ho scritto un Django-REST-Framework-bulk che permette di fare quello in un paio di righe (l'esempio solo fa l'aggiornamento alla rinfusa ma la biblioteca consente anche la creazione e l'eliminazione di massa):

from rest_framework_bulk import ListCreateBulkUpdateAPIView 

class FooView(ListCreateBulkUpdateAPIView): 
    model = FooModel 
+9

Django-REST-Framework-bulk non sembra più essere mantenuto. – Joseph