2016-03-22 11 views
0

Benim serileştirici iki iç içe serilaştırıcı içerir, bu nedenle bu seri hale getirici güncelleme yöntemini geçersiz kılar. Ancak, bu güncelleştirme yöntemine gönderilen validated_data alanı "temizlenir" ve birçok alanın çoğu yok.django dinlenme çerçevesi partial_update yaparken birçok alanda birçok alanı silme

serializer.initial_data

QueryDict şudur: Bu ModelSerializer arasında

güncelleme (iç validated_data)

şöyledir: {[, u'9' u'exchange u'1]}

{ 'ADGROUP_NAME': u'adgroup_name', u'creative ': [], güncelleme içine validated_data() 'CAMPAIGN_ID':, u'exchange': []}

alanı "excha nge "temelde kaldırıldı veya temizlendi! Bundan nasıl kurtulurum? Model: görünümünde

class AdGroup(models.Model): 
adgroup_name = models.CharField(max_length=200, verbose_name="Name") 
exchange = models.ManyToManyField(Exchange, verbose_name="Exchange") 
creative = models.ManyToManyField(Creative, verbose_name="Creative") 

Güncelleme kodu:

class AdGroupViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet): 
     queryset = AdGroup.objects.all().order_by('-id') 
     serializer_class = AdGroupSerializer 
     filter_fields = ('campaign_id',) 
     def update(self, 

request, *args, **kwargs): 
      try: 
       partial = kwargs.pop('partial', False) 
       instance = self.get_object()   
       serializer = self.get_serializer(instance, data=request.data, partial=partial) 

       print 'view serializer data is' 
       print serializer.initial_data 
       serializer.is_valid(raise_exception=True) 
       self.perform_update(serializer) 
       return Response(serializer.data) 
      except Exception as e:   
       print "update in viewset error "+str(e) 
       traceback.print_exc() 

     def perform_update(self, serializer): 
       serializer.save() 


     def partial_update(self, request, *args, **kwargs): 
       kwargs['partial'] = True 
       print 'partial update called with' 
       print request.data 
      return self.update(request, *args, **kwargs) 

serileştirici kodudur:

class AdGroupSerializer(serializers.ModelSerializer): 
    exchange = ExchangeSerializer(many=True) 
    creative = CreativeSerializer_reduced(many=True) 
    class Meta: 
     model = AdGroup 
     fields = ('id','name','exchange','creative') 

    def update(self, instance, validated_data): 
     try: 
      print 'serialzier update called and the validated_data is' 
      print validated_data 
      if validated_data['state']: 
       print 'state is sent' 
       instance.state = validated_data['state'] 

      if validated_data['exchange']: 
       print 'exchange is sent' 
       print validated_data['exchange'] 
       instance.exchange = validated_data['exchange'] 

      if validated_data['creative']: 
       print 'creaitve is sent' 
       print validated_data['creative'] 
       instance.creative = validated_data['creative'] 

      instance.save() 
      return instance 
     except Exception as e: 
      logger.info("Update Serializer error is "+str(e)) 

Değişim serileştirici geçerli:

class ExchangeSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Exchange 
     fields = ('id','name',) 

Creaitve serileştirici geçerli:

cevap

1

Bana çarpan bir şey, yuvalanmış bir seri hale getirici bildirmeniz ve düz kimlikleri göndermenizdir. Serializer, exchange gönderip aldığınızı ancak alanın hiçbiri bulunmadığını tespit ettiğinden boş bir listeniz var.

+0

Evet. Sorun buydu. Ön uç gönderme listesi ID'leri vardı, çünkü bu M2M ilişkileri olan nesneyi oluştururken DB'ye kaydetmek daha kolaydı. Şu anda iki serileştirici kullanıyorum - biri (bu iç içe geçme yolu dahil) ve diğeri oluşturmak için (kimliklerin listesi olan). – ram